ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。
产生原因
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示 。
表达方式
标准表
Bin
(二进制)
|
Oct
(八进制)
|
Dec
(十进制)
|
Hex
(十六进制)
|
缩写/字符
|
解释
|
0000 0000
|
00
|
0
|
0x00
|
NUL(null)
|
空字符
|
0000 0001
|
01
|
1
|
0x01
|
SOH(start of headline)
|
标题开始
|
0000 0010
|
02
|
2
|
0x02
|
STX (start of text)
|
正文开始
|
0000 0011
|
03
|
3
|
0x03
|
ETX (end of text)
|
正文结束
|
0000 0100
|
04
|
4
|
0x04
|
EOT (end of transmission)
|
传输结束
|
0000 0101
|
05
|
5
|
0x05
|
ENQ (enquiry)
|
请求
|
0000 0110
|
06
|
6
|
0x06
|
ACK (acknowledge)
|
收到通知
|
0000 0111
|
07
|
7
|
0x07
|
BEL (bell)
|
响铃
|
0000 1000
|
010
|
8
|
0x08
|
BS (backspace)
|
退格
|
0000 1001
|
011
|
9
|
0x09
|
HT (horizontal tab)
|
水平制表符
|
0000 1010
|
012
|
10
|
0x0A
|
LF (NL line feed, new line)
|
换行键
|
0000 1011
|
013
|
11
|
0x0B
|
VT (vertical tab)
|
垂直制表符
|
0000 1100
|
014
|
12
|
0x0C
|
FF (NP form feed, new page)
|
换页键
|
0000 1101
|
015
|
13
|
0x0D
|
CR (carriage return)
|
回车键
|
0000 1110
|
016
|
14
|
0x0E
|
SO (shift out)
|
不用切换
|
0000 1111
|
017
|
15
|
0x0F
|
SI (shift in)
|
启用切换
|
0001 0000
|
020
|
16
|
0x10
|
DLE (data link escape)
|
数据链路转义
|
0001 0001
|
021
|
17
|
0x11
|
DC1 (device control 1)
|
设备控制1
|
0001 0010
|
022
|
18
|
0x12
|
DC2 (device control 2)
|
设备控制2
|
0001 0011
|
023
|
19
|
0x13
|
DC3 (device control 3)
|
设备控制3
|
0001 0100
|
024
|
20
|
0x14
|
DC4 (device control 4)
|
设备控制4
|
0001 0101
|
025
|
21
|
0x15
|
NAK (negative acknowledge)
|
拒绝接收
|
0001 0110
|
026
|
22
|
0x16
|
SYN (synchronous idle)
|
同步空闲
|
0001 0111
|
027
|
23
|
0x17
|
ETB (end of trans. block)
|
结束传输块
|
0001 1000
|
030
|
24
|
0x18
|
CAN (cancel)
|
取消
|
0001 1001
|
031
|
25
|
0x19
|
EM (end of medium)
|
媒介结束
|
0001 1010
|
032
|
26
|
0x1A
|
SUB (substitute)
|
代替
|
0001 1011
|
033
|
27
|
0x1B
|
ESC (escape)
|
换码(溢出)
|
0001 1100
|
034
|
28
|
0x1C
|
FS (file separator)
|
文件分隔符
|
0001 1101
|
035
|
29
|
0x1D
|
GS (group separator)
|
分组符
|
0001 1110
|
036
|
30
|
0x1E
|
RS (record separator)
|
记录分隔符
|
0001 1111
|
037
|
31
|
0x1F
|
US (unit separator)
|
单元分隔符
|
0010 0000
|
040
|
32
|
0x20
|
(space)
|
空格
|
0010 0001
|
041
|
33
|
0x21
|
!
|
叹号 |
0010 0010
|
042
|
34
|
0x22
|
“
|
双引号 |
0010 0011
|
043
|
35
|
0x23
|
#
|
井号 |
0010 0100
|
044
|
36
|
0x24
|
$
|
美元符 |
0010 0101
|
045
|
37
|
0x25
|
%
|
百分号 |
0010 0110
|
046
|
38
|
0x26
|
&
|
和号 |
0010 0111
|
047
|
39
|
0x27
|
‘
|
闭单引号 |
0010 1000
|
050
|
40
|
0x28
|
(
|
开括号
|
0010 1001
|
051
|
41
|
0x29
|
)
|
闭括号
|
0010 1010
|
052
|
42
|
0x2A
|
*
|
星号 |
0010 1011
|
053
|
43
|
0x2B
|
+
|
加号 |
0010 1100
|
054
|
44
|
0x2C
|
,
|
逗号 |
0010 1101
|
055
|
45
|
0x2D
|
–
|
减号/破折号 |
0010 1110
|
056
|
46
|
0x2E
|
.
|
句号 |
0010 1111
|
057
|
47
|
0x2F
|
/
|
斜杠 |
0011 0000
|
060
|
48
|
0x30
|
0
|
字符0 |
0011 0001
|
061
|
49
|
0x31
|
1
|
字符1 |
0011 0010
|
062
|
50
|
0x32
|
2
|
字符2 |
0011 0011
|
063
|
51
|
0x33
|
3
|
字符3 |
0011 0100
|
064
|
52
|
0x34
|
4
|
字符4 |
0011 0101
|
065
|
53
|
0x35
|
5
|
字符5 |
0011 0110
|
066
|
54
|
0x36
|
6
|
字符6 |
0011 0111
|
067
|
55
|
0x37
|
7
|
字符7 |
0011 1000
|
070
|
56
|
0x38
|
8
|
字符8 |
0011 1001
|
071
|
57
|
0x39
|
9
|
字符9 |
0011 1010
|
072
|
58
|
0x3A
|
:
|
冒号 |
0011 1011
|
073
|
59
|
0x3B
|
;
|
分号 |
0011 1100
|
074
|
60
|
0x3C
|
<
|
小于 |
0011 1101
|
075
|
61
|
0x3D
|
=
|
等号 |
0011 1110
|
076
|
62
|
0x3E
|
>
|
大于 |
0011 1111
|
077
|
63
|
0x3F
|
?
|
问号 |
0100 0000
|
0100
|
64
|
0x40
|
@
|
电子邮件符号 |
0100 0001
|
0101
|
65
|
0x41
|
A
|
大写字母A |
0100 0010
|
0102
|
66
|
0x42
|
B
|
大写字母B |
0100 0011
|
0103
|
67
|
0x43
|
C
|
大写字母C |
0100 0100
|
0104
|
68
|
0x44
|
D
|
大写字母D |
0100 0101
|
0105
|
69
|
0x45
|
E
|
大写字母E |
0100 0110
|
0106
|
70
|
0x46
|
F
|
大写字母F |
0100 0111
|
0107
|
71
|
0x47
|
G
|
大写字母G |
0100 1000
|
0110
|
72
|
0x48
|
H
|
大写字母H |
0100 1001
|
0111
|
73
|
0x49
|
I
|
大写字母I |
01001010
|
0112
|
74
|
0x4A
|
J
|
大写字母J |
0100 1011
|
0113
|
75
|
0x4B
|
K
|
大写字母K |
0100 1100
|
0114
|
76
|
0x4C
|
L
|
大写字母L |
0100 1101
|
0115
|
77
|
0x4D
|
M
|
大写字母M |
0100 1110
|
0116
|
78
|
0x4E
|
N
|
大写字母N |
0100 1111
|
0117
|
79
|
0x4F
|
O
|
大写字母O |
0101 0000
|
0120
|
80
|
0x50
|
P
|
大写字母P |
0101 0001
|
0121
|
81
|
0x51
|
Q
|
大写字母Q |
0101 0010
|
0122
|
82
|
0x52
|
R
|
大写字母R |
0101 0011
|
0123
|
83
|
0x53
|
S
|
大写字母S |
0101 0100
|
0124
|
84
|
0x54
|
T
|
大写字母T |
0101 0101
|
0125
|
85
|
0x55
|
U
|
大写字母U |
0101 0110
|
0126
|
86
|
0x56
|
V
|
大写字母V |
0101 0111
|
0127
|
87
|
0x57
|
W
|
大写字母W |
0101 1000
|
0130
|
88
|
0x58
|
X
|
大写字母X |
0101 1001
|
0131
|
89
|
0x59
|
Y
|
大写字母Y |
0101 1010
|
0132
|
90
|
0x5A
|
Z
|
大写字母Z |
0101 1011
|
0133
|
91
|
0x5B
|
[
|
开方括号 |
0101 1100
|
0134
|
92
|
0x5C
|
\
|
反斜杠 |
0101 1101
|
0135
|
93
|
0x5D
|
]
|
闭方括号 |
0101 1110
|
0136
|
94
|
0x5E
|
^
|
脱字符 |
0101 1111
|
0137
|
95
|
0x5F
|
_
|
下划线 |
0110 0000
|
0140
|
96
|
0x60
|
`
|
开单引号 |
0110 0001
|
0141
|
97
|
0x61
|
a
|
小写字母a |
0110 0010
|
0142
|
98
|
0x62
|
b
|
小写字母b |
0110 0011
|
0143
|
99
|
0x63
|
c
|
小写字母c |
0110 0100
|
0144
|
100
|
0x64
|
d
|
小写字母d |
0110 0101
|
0145
|
101
|
0x65
|
e
|
小写字母e |
0110 0110
|
0146
|
102
|
0x66
|
f
|
小写字母f |
0110 0111
|
0147
|
103
|
0x67
|
g
|
小写字母g |
0110 1000
|
0150
|
104
|
0x68
|
h
|
小写字母h |
0110 1001
|
0151
|
105
|
0x69
|
i
|
小写字母i |
0110 1010
|
0152
|
106
|
0x6A
|
j
|
小写字母j |
0110 1011
|
0153
|
107
|
0x6B
|
k
|
小写字母k |
0110 1100
|
0154
|
108
|
0x6C
|
l
|
小写字母l |
0110 1101
|
0155
|
109
|
0x6D
|
m
|
小写字母m |
0110 1110
|
0156
|
110
|
0x6E
|
n
|
小写字母n |
0110 1111
|
0157
|
111
|
0x6F
|
o
|
小写字母o |
0111 0000
|
0160
|
112
|
0x70
|
p
|
小写字母p |
0111 0001
|
0161
|
113
|
0x71
|
q
|
小写字母q |
0111 0010
|
0162
|
114
|
0x72
|
r
|
小写字母r |
0111 0011
|
0163
|
115
|
0x73
|
s
|
小写字母s |
0111 0100
|
0164
|
116
|
0x74
|
t
|
小写字母t |
0111 0101
|
0165
|
117
|
0x75
|
u
|
小写字母u |
0111 0110
|
0166
|
118
|
0x76
|
v
|
小写字母v |
0111 0111
|
0167
|
119
|
0x77
|
w
|
小写字母w |
0111 1000
|
0170
|
120
|
0x78
|
x
|
小写字母x |
0111 1001
|
0171
|
121
|
0x79
|
y
|
小写字母y |
0111 1010
|
0172
|
122
|
0x7A
|
z
|
小写字母z |
0111 1011
|
0173
|
123
|
0x7B
|
{
|
开花括号 |
0111 1100
|
0174
|
124
|
0x7C
|
|
|
垂线 |
0111 1101
|
0175
|
125
|
0x7D
|
}
|
闭花括号 |
0111 1110
|
0176
|
126
|
0x7E
|
~
|
波浪号 |
0111 1111
|
0177
|
127
|
0x7F
|
DEL (delete)
|
删除
|
大小规则
对控制字符的解释
ASCII 编码中第 0~31 个字符(开头的 32 个字符)以及第 127 个字符(最后一个字符)都是不可见的(无法显示),但是它们都具有一些特殊功能,所以称为控制字符( Control Character)或者功能码(Function Code)。
这 33 个控制字符大都与通信、数据存储以及老式设备有关,有些在现代电脑中的含义已经改变了。
有些控制符需要一定的计算机功底才能理解,初学者可以跳过,选择容易的理解即可。
下面列出了部分控制字符的具体功能:
-
NUL (0)
NULL,空字符。空字符起初本意可以看作为 NOP(中文意为空操作,就是啥都不做的意思),此位置可以忽略一个字符。
之所以有这个空字符,主要是用于计算机早期的记录信息的纸带,此处留个 NUL 字符,意思是先占这个位置,以待后用,比如你哪天想起来了,在这个位置在放一个别的啥字符之类的。
后来呢,NUL 被用于C语言中,表示字符串的结束,当一个字符串中间出现 NUL 时,就意味着这个是一个字符串的结尾了。这样就方便按照自己需求去定义字符串,多长都行,当然只要你内存放得下,然后最后加一个\0,即空字符,意思是当前字符串到此结束。
-
SOH (1)
Start Of Heading,标题开始。如果信息沟通交流主要以命令和消息的形式的话,SOH 就可以用于标记每个消息的开始。
1963年,最开始 ASCII 标准中,把此字符定义为 Start of Message,后来又改为现在的 Start Of Heading。
现在,这个 SOH 常见于主从(master-slave)模式的 RS232 的通信中,一个主设备,以 SOH 开头,和从设备进行通信。这样方便从设备在数据传输出现错误的时候,在下一次通信之前,去实现重新同步(resynchronize)。如果没有一个清晰的类似于 SOH 这样的标记,去标记每个命令的起始或开头的话,那么重新同步,就很难实现了。
-
STX (2) 和 ETX (3)
STX 表示 Start Of Text,意思是“文本开始”;ETX 表示 End Of Text,意思是“文本结束”。
通过某种通讯协议去传输的一个数据(包),称为一帧的话,常会包含一个帧头,包含了寻址信息,即你是要发给谁,要发送到目的地是哪里,其后跟着真正要发送的数据内容。
而 STX,就用于标记这个数据内容的开始。接下来是要传输的数据,最后是 ETX,表明数据的结束。
而中间具体传输的数据内容,ASCII 并没有去定义,它和你所用的传输协议有关。
帧头 数据或文本内容 SOH(表明帧头开始) ……(帧头信息,比如包含了目的地址,表明你发送给谁等等) STX(表明数据开始) ……(真正要传输的数据) ETX(表明数据结束 -
BEL (7)
BELl,响铃。在 ASCII 编码中,BEL 是个比较有意思的东西。BEL 用一个可以听得见的声音来吸引人们的注意,既可以用于计算机,也可以用于周边设备(比如打印机)。
注意,BEL 不是声卡或者喇叭发出的声音,而是蜂鸣器发出的声音,主要用于报警,比如硬件出现故障时就会听到这个声音,有的计算机操作系统正常启动也会听到这个声音。蜂鸣器没有直接安装到主板上,而是需要连接到主板上的一种外设,现代很多计算机都不安装蜂鸣器了,即使输出 BEL 也听不到声音,这个时候 BEL 就没有任何作用了。
-
BS (8)
BackSpace,退格键。退格键的功能,随着时间变化,意义也变得不同了。
退格键起初的意思是,在打印机和电传打字机上,往回移动一格光标,以起到强调该字符的作用。比如你想要打印一个 a,然后加上退格键后,就成了 aBS^。在机械类打字机上,此方法能够起到实际的强调字符的作用,但是对于后来的 CTR 下时期来说,就无法起到对应效果了。
而现代所用的退格键,不仅仅表示光标往回移动了一格,同时也删除了移动后该位置的字符。
-
HT (9)
Horizontal Tab,水平制表符,相当于 Table/Tab 键。
水平制表符的作用是用于布局,它控制输出设备前进到下一个表格去处理。而制表符 Table/Tab 的宽度也是灵活不固定的,只不过在多数设备上制表符 Tab 都预定义为 4 个空格的宽度。
水平制表符 HT 不仅能减少数据输入者的工作量,对于格式化好的文字来说,还能够减少存储空间,因为一个Tab键,就代替了 4 个空格。
-
LF (10)
Line Feed,直译为“给打印机等喂一行”,也就是“换行”的意思。LF 是 ASCII 编码中常被误用的字符之一。
LF 的最原始的含义是,移动打印机的头到下一行。而另外一个 ASCII 字符,CR(Carriage Return)才是将打印机的头移到最左边,即一行的开始(行首)。很多串口协议和 MS-DOS 及 Windows 操作系统,也都是这么实现的。
而C语言和 Unix 操作系统将 LF 的含义重新定义为“新行”,即 LF 和 CR 的组合效果,也就是回车且换行的意思。
从程序的角度出发,C语言和 Unix 对 LF 的定义显得更加自然,而 MS-DOS 的实现更接近于 LF 的本意。
现在人们常将 LF 用做“新行(newline)”的功能,大多数文本编辑软件也都可以处理单个 LF 或者 CR/LF 的组合了。
-
VT (11)
Vertical Tab,垂直制表符。它类似于水平制表符 Tab,目的是为了减少布局中的工作,同时也减少了格式化字符时所需要存储字符的空间。VT 控制符用于跳到下一个标记行。
说实话,还真没看到有些地方需要用 VT,因为一般在换行的时候都是用 LF 代替 VT 了。
-
FF (12)
Form Feed,换页。设计换页键,是用来控制打印机行为的。当打印机收到此键码的时候,打印机移动到下一页。
不同的设备的终端对此控制符所表现的行为各不同,有些会清除屏幕,有些只是显示
^L
字符,有些只是新换一行而已。例如,Unix/Linux 下的 Bash Shell 和 Tcsh 就把 FF 看做是一个清空屏幕的命令。 -
CR (13)
Carriage return,回车,表示机器的滑动部分(或者底座)返回。
CR 回车的原意是让打印头回到左边界,并没有移动到下一行的意思。随着时间的流逝,后来人们把 CR 的意思弄成了 Enter 键,用于示意输入完毕。
在数据以屏幕显示的情况下,人们按下 Enter 的同时,也希望把光标移动到下一行,因此C语言和 Unix 重新定义了 CR 的含义,将其表示为移动到下一行。当输入 CR 时,系统也常常隐式地将其转换为LF。
-
SO (14) 和 SI (15)
SO,Shift Out,不用切换;SI,Shift In,启用切换。
早在 1960s 年代,设计 ASCII 编码的美国人就已经想到了,ASCII 编码不仅仅能用于英文,也要能用于外文字符集,这很重要,定义 Shift In 和 Shift Out 正是考虑到了这点。
最开始,其意为在西里尔语和拉丁语之间切换。西里尔语 ASCII(也即 KOI-7 编码)将 Shift 作为一个普通字符,而拉丁语 ASCII(也就是我们通常所说的 ASCII)用 Shift 去改变打印机的字体,它们完全是两种含义。
在拉丁语 ASCII 中,SO 用于产生双倍宽度的字符(类似于全角),而用 SI 打印压缩的字体(类似于半角)。
-
DLE (16)
Data Link Escape,数据链路转义。
有时候我们需要在通信过程中发送一些控制字符,但是总有一些情况下,这些控制字符被看成了普通的数据流,而没有起到对应的控制效果,ASCII 编码引入 DLE 来解决这类问题。
如果数据流中检测到了 DLE,数据接收端会对数据流中接下来的字符另作处理。但是具体如何处理,ASCII 规范中并没有定义,只是弄了个 DLE 去打断正常的数据流,告诉接下来的数据要特殊对待。
-
DC1 (17)
Device Control 1,或者 XON – Transmission on。
这个 ASCII 控制符尽管原先定义为 DC1, 但是现在常表示为 XON,用于串行通信中的软件流控制。其主要作用为,在通信被控制符 XOFF 中断之后,重新开始信息传输。
用过串行终端的人应该还记得,当有时候数据出错了,按 Ctrl+Q(等价于XON)有时候可以起到重新传输的效果。这是因为,此 Ctrl+Q 键盘序列实际上就是产生 XON 控制符,它可以将那些由于终端或者主机方面,由于偶尔出现的错误的 XOFF 控制符而中断的通信解锁,使其正常通信。
-
DC3 (19)
Device Control 3,或者 XOFF(Transmission off,传输中断)。
EM (25)
End of Medium,已到介质末端,介质存储已满。
EM 用于,当数据存储到达串行存储介质末尾的时候,就像磁带或磁头滚动到介质末尾一样。其用于表述数据的逻辑终点,即不必非要是物理上的达到数据载体的末尾。
-
FS(28)
File Separator,文件分隔符。FS 是个很有意思的控制字符,它可以让我们看到 1960s 年代的计算机是如何组织的。
我们现在习惯于随机访问一些存储介质,比如 RAM、磁盘等,但是在设计 ASCII 编码的那个年代,大部分数据还是顺序的、串行的,而不是随机访问的。此处所说的串行,不仅仅指的是串行通信,还指的是顺序存储介质,比如穿孔卡片、纸带、磁带等。
在串行通信的时代,设计这么一个用于表示文件分隔的控制字符,用于分割两个单独的文件,是一件很明智的事情。
-
GS(29)
Group Separator,分组符。
ASCII 定义控制字符的原因之一就是考虑到了数据存储。
大部分情况下,数据库的建立都和表有关,表包含了多条记录。同一个表中的所有记录属于同一类型,不同的表中的记录属于不同的类型。
而分组符 GS 就是用来分隔串行数据存储系统中的不同的组。值得注意的是,当时还没有使用 Excel 表格,ASCII 时代的人把它叫做组。
-
RS(30)
Record Separator,记录分隔符,用于分隔一个组或表中的多条记录。
-
US(31)
Unit Separator,单元分隔符。
在 ASCII 定义中,数据库中所存储的最小的数据项叫做单元(Unit)。而现在我们称其字段(Field)。单元分隔符 US 用于分割串行数据存储环境下的不同单元。
现在的数据库实现都要求大部分类型都拥有固定的长度,尽管有时候可能用不到,但是对于每一个字段,却都要分配足够大的空间,用于存放最大可能的数据。
这种做法的弊端就是占用了大量的存储空间,而 US 控制符允许字段具有可变的长度。在 1960s 年代,数据存储空间很有限,用 US 将不同单元分隔开,能节省很多空间。
-
DEL (127)
Delete,删除。
有人也许会问,为何 ASCII 编码中其它控制字符的值都很小(即 0~31),而 DEL 的值却很大呢(为 127)?
这是由于这个特殊的字符是为纸带而定义的。在那个年代,绝大多数的纸带都是用7个孔洞去编码数据的。而 127 这个值所对应的二进制值为111 1111(所有 7 个比特位都是1),将 DEL 用在现存的纸带上时,所有的洞就都被穿孔了,就把已经存在的数据都擦除掉了,就起到了删除的作用。