ASCII码一览表,ASCII码对照表


分类:默认 作者:myerob 标签:ASCII 对照表 阅读:1665 收藏
导读:
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,用一个字…

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,用一个字节就可以存储,它等同于国际标准 ISO/IEC 646。  

ASCII 编码于 1967 年第一次发布,最后一次更新是在 1986 年,迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是 1234567890)、标点符号(,.!等)、特殊符号(@#$%^&等)以及一些具有控制功能的字符(往往不会显示出来)。  

ASCII 编码是美国人给自己设计的,他们并没有考虑欧洲那些扩展的拉丁字母,也没有考虑韩语和日语,我大中华几万个汉字更是不可能被重视。计算机也是美国人发明的,起初使用的就是 ASCII 码,只能显示英文字符。各个国家为了让本国公民也能正常使用计算机,开始效仿 ASCII 开发自己的字符编码,例如 ISO/IEC 8859(欧洲字符集)、shift_Jis(日语字符集)、GBK(中文字符集)等。

【ASCII码对照表】:http://www.23bei.com/article/95.html

【ASCII码对照表】

ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92\124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

特殊字符说明

NUL空VT 垂直制表SYN 空转同步
STX 正文开始CR 回车CAN 作废
ETX 正文结束SO 移位输出EM 纸尽
EOY 传输结束SI 移位输入SUB 换置
ENQ 询问字符DLE 空格ESC 换码
ACK 承认DC1 设备控制1FS 文字分隔符
BEL 报警DC2 设备控制2GS 组分隔符
BS 退一格DC3 设备控制3RS 记录分隔符
HT 横向列表DC4 设备控制4US 单元分隔符
LF 换行NAK 否定DEL 删除

 

下面为对控制字符的详细解释:

ASCII编码中第0~31个字符(开头的32个字符)以及第127个字符(最后一个字符)都是不可见的(无法显示),但是它们都具有一些特殊功能,所以称为控制字符(ControlCharacter)或者功能码(FunctionCode)。

这33个控制字符大都与通信、数据存储以及老式设备有关,有些在现代电脑中的含义已经改变了。

有些控制符需要一定的计算机功底才能理解,初学者可以跳过,选择容易的理解即可。

下面列出了部分控制字符的具体功能:

NUL(0)

NULL,空字符。空字符起初本意可以看作为NOP(中文意为空操作,就是啥都不做的意思),此位置可以忽略一个字符。

之所以有这个空字符,主要是用于计算机早期的记录信息的纸带,此处留个NUL字符,意思是先占这个位置,以待后用,比如你哪天想起来了,在这个位置在放一个别的啥字符之类的。

后来呢,NUL被用于C语言中,表示字符串的结束,当一个字符串中间出现NUL时,就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串,多长都行,当然只要你内存放得下,然后最后加一个\0,即空字符,意思是当前字符串到此结束。

SOH(1)

StartOfHeading,标题开始。如果信息沟通交流主要以命令和消息的形式的话,SOH就可以用于标记每个消息的开始。

1963年,最开始ASCII标准中,把此字符定义为StartofMessage,后来又改为现在的StartOfHeading。

现在,这个SOH常见于主从(master-slave)模式的RS232的通信中,一个主设备,以SOH开头,和从设备进行通信。这样方便从设备在数据传输出现错误的时候,在下一次通信之前,去实现重新同步(resynchronize)。如果没有一个清晰的类似于SOH这样的标记,去标记每个命令的起始或开头的话,那么重新同步,就很难实现了。

STX(2)和ETX(3)

STX表示StartOfText,意思是“文本开始”;ETX表示EndOfText,意思是“文本结束”。

通过某种通讯协议去传输的一个数据(包),称为一帧的话,常会包含一个帧头,包含了寻址信息,即你是要发给谁,要发送到目的地是哪里,其后跟着真正要发送的数据内容。

而STX,就用于标记这个数据内容的开始。接下来是要传输的数据,最后是ETX,表明数据的结束。

而中间具体传输的数据内容,ASCII并没有去定义,它和你所用的传输协议有关。

帧头数据或文本内容

SOH(表明帧头开始)......(帧头信息,比如包含了目的地址,表明你发送给谁等等)STX(表明数据开始)......(真正要传输的数据)ETX(表明数据结束

BEL(7)

BELl,响铃。在ASCII编码中,BEL是个比较有意思的东西。BEL用一个可以听得见的声音来吸引人们的注意,既可以用于计算机,也可以用于周边设备(比如打印机)。

注意,BEL不是声卡或者喇叭发出的声音,而是蜂鸣器发出的声音,主要用于报警,比如硬件出现故障时就会听到这个声音,有的计算机操作系统正常启动也会听到这个声音。蜂鸣器没有直接安装到主板上,而是需要连接到主板上的一种外设,现代很多计算机都不安装蜂鸣器了,即使输出BEL也听不到声音,这个时候BEL就没有任何作用了。

BS(8)

BackSpace,退格键。退格键的功能,随着时间变化,意义也变得不同了。

退格键起初的意思是,在打印机和电传打字机上,往回移动一格光标,以起到强调该字符的作用。比如你想要打印一个a,然后加上退格键后,就成了aBS^。在机械类打字机上,此方法能够起到实际的强调字符的作用,但是对于后来的CTR下时期来说,就无法起到对应效果了。

而现代所用的退格键,不仅仅表示光标往回移动了一格,同时也删除了移动后该位置的字符。

HT(9)

HorizontalTab,水平制表符,相当于Table/Tab键。

水平制表符的作用是用于布局,它控制输出设备前进到下一个表格去处理。而制表符Table/Tab的宽度也是灵活不固定的,只不过在多数设备上制表符Tab都预定义为4个空格的宽度。

水平制表符HT不仅能减少数据输入者的工作量,对于格式化好的文字来说,还能够减少存储空间,因为一个Tab键,就代替了4个空格。

LF(10)

LineFeed,直译为“给打印机等喂一行”,也就是“换行”的意思。LF是ASCII编码中常被误用的字符之一。

LF的最原始的含义是,移动打印机的头到下一行。而另外一个ASCII字符,CR(CarriageReturn)才是将打印机的头移到最左边,即一行的开始(行首)。很多串口协议和MS-DOS及Windows操作系统,也都是这么实现的。

而C语言和Unix操作系统将LF的含义重新定义为“新行”,即LF和CR的组合效果,也就是回车且换行的意思。

从程序的角度出发,C语言和Unix对LF的定义显得更加自然,而MS-DOS的实现更接近于LF的本意。

现在人们常将LF用做“新行(newline)”的功能,大多数文本编辑软件也都可以处理单个LF或者CR/LF的组合了。

VT(11)

VerticalTab,垂直制表符。它类似于水平制表符Tab,目的是为了减少布局中的工作,同时也减少了格式化字符时所需要存储字符的空间。VT控制符用于跳到下一个标记行。

说实话,还真没看到有些地方需要用VT,因为一般在换行的时候都是用LF代替VT了。

FF(12)

FormFeed,换页。设计换页键,是用来控制打印机行为的。当打印机收到此键码的时候,打印机移动到下一页。

不同的设备的终端对此控制符所表现的行为各不同,有些会清除屏幕,有些只是显示^L字符,有些只是新换一行而已。例如,Unix/Linux下的BashShell和Tcsh就把FF看做是一个清空屏幕的命令。

CR(13)

Carriagereturn,回车,表示机器的滑动部分(或者底座)返回。

CR回车的原意是让打印头回到左边界,并没有移动到下一行的意思。随着时间的流逝,后来人们把CR的意思弄成了Enter键,用于示意输入完毕。

在数据以屏幕显示的情况下,人们按下Enter的同时,也希望把光标移动到下一行,因此C语言和Unix重新定义了CR的含义,将其表示为移动到下一行。当输入CR时,系统也常常隐式地将其转换为LF。

SO(14)和SI(15)

SO,ShiftOut,不用切换;SI,ShiftIn,启用切换。

早在1960s年代,设计ASCII编码的美国人就已经想到了,ASCII编码不仅仅能用于英文,也要能用于外文字符集,这很重要,定义ShiftIn和ShiftOut正是考虑到了这点。

最开始,其意为在西里尔语和拉丁语之间切换。西里尔语ASCII(也即KOI-7编码)将Shift作为一个普通字符,而拉丁语ASCII(也就是我们通常所说的ASCII)用Shift去改变打印机的字体,它们完全是两种含义。

在拉丁语ASCII中,SO用于产生双倍宽度的字符(类似于全角),而用SI打印压缩的字体(类似于半角)。

DLE(16)

DataLinkEscape,数据链路转义。

有时候我们需要在通信过程中发送一些控制字符,但是总有一些情况下,这些控制字符被看成了普通的数据流,而没有起到对应的控制效果,ASCII编码引入DLE来解决这类问题。

如果数据流中检测到了DLE,数据接收端会对数据流中接下来的字符另作处理。但是具体如何处理,ASCII规范中并没有定义,只是弄了个DLE去打断正常的数据流,告诉接下来的数据要特殊对待。

DC1(17)

DeviceControl1,或者XON–Transmissionon。

这个ASCII控制符尽管原先定义为DC1,但是现在常表示为XON,用于串行通信中的软件流控制。其主要作用为,在通信被控制符XOFF中断之后,重新开始信息传输。

用过串行终端的人应该还记得,当有时候数据出错了,按Ctrl+Q(等价于XON)有时候可以起到重新传输的效果。这是因为,此Ctrl+Q键盘序列实际上就是产生XON控制符,它可以将那些由于终端或者主机方面,由于偶尔出现的错误的XOFF控制符而中断的通信解锁,使其正常通信。

DC3(19)

DeviceControl3,或者XOFF(Transmissionoff,传输中断)。

EM(25)

EndofMedium,已到介质末端,介质存储已满。

EM用于,当数据存储到达串行存储介质末尾的时候,就像磁带或磁头滚动到介质末尾一样。其用于表述数据的逻辑终点,即不必非要是物理上的达到数据载体的末尾。

FS(28)

FileSeparator,文件分隔符。FS是个很有意思的控制字符,它可以让我们看到1960s年代的计算机是如何组织的。

我们现在习惯于随机访问一些存储介质,比如RAM、磁盘等,但是在设计ASCII编码的那个年代,大部分数据还是顺序的、串行的,而不是随机访问的。此处所说的串行,不仅仅指的是串行通信,还指的是顺序存储介质,比如穿孔卡片、纸带、磁带等。

在串行通信的时代,设计这么一个用于表示文件分隔的控制字符,用于分割两个单独的文件,是一件很明智的事情。

GS(29)

GroupSeparator,分组符。

ASCII定义控制字符的原因之一就是考虑到了数据存储。

大部分情况下,数据库的建立都和表有关,表包含了多条记录。同一个表中的所有记录属于同一类型,不同的表中的记录属于不同的类型。

而分组符GS就是用来分隔串行数据存储系统中的不同的组。值得注意的是,当时还没有使用Excel表格,ASCII时代的人把它叫做组。

RS(30)

RecordSeparator,记录分隔符,用于分隔一个组或表中的多条记录。

US(31)

UnitSeparator,单元分隔符。

在ASCII定义中,数据库中所存储的最小的数据项叫做单元(Unit)。而现在我们称其字段(Field)。单元分隔符US用于分割串行数据存储环境下的不同单元。

现在的数据库实现都要求大部分类型都拥有固定的长度,尽管有时候可能用不到,但是对于每一个字段,却都要分配足够大的空间,用于存放最大可能的数据。

这种做法的弊端就是占用了大量的存储空间,而US控制符允许字段具有可变的长度。在1960s年代,数据存储空间很有限,用US将不同单元分隔开,能节省很多空间。

DEL(127)

Delete,删除。

有人也许会问,为何ASCII编码中其它控制字符的值都很小(即0~31),而DEL的值却很大呢(为127)?

这是由于这个特殊的字符是为纸带而定义的。在那个年代,绝大多数的纸带都是用7个孔洞去编码数据的。而127这个值所对应的二进制值为1111111(所有7个比特位都是1),将DEL用在现存的纸带上时,所有的洞就都被穿孔了,就把已经存在的数据都擦除掉了,就起到了删除的作用。

也有人将ASCII编码分成两部分:

前128个字符称为基本ASCII,包含常见字符;

后128个字符称为扩展ASCII,包含一些特殊字符。


相关推荐