admin 管理员组文章数量: 887021
2024年1月4日发(作者:手机浏览器怎么启用javascript)
ASCII编码,将英文存储到计算机
前面我们已经讲到,计算机是以二进制的形式来存储数据的,它只认识 0 和 1 两个数字,我们在屏幕上看到的文字,在存储之前都被转换成了二进制(0和1序列),在显示时也要根据二进制找到对应的字符。
可想而知,特定的文字必然对应着固定的二进制,否则在转换时将发生混乱。那么,怎样将文字与二进制对应起来呢?这就需要有一套规范,计算机公司和软件开发者都必须遵守,这样的一套规范就称为字符集(Character Set)或者字符编码(Character Encoding)。
严格来说,字符集和字符编码不是一个概念,字符集定义了文字和二进制的对应关系,为字符分配了唯一的编号,而字符编码规定了如何将文字的编号存储到计算机中。我们暂时先不讨论这些细节,姑且认为它们是一个概念,本节中我也混用了这两个概念,未做区分。
字符集为每个字符分配一个唯一的编号,类似于学生的学号,通过编号就能够找到对应的字符。
可以将字符集理解成一个很大的表格,它列出了所有字符和二进制的对应关系,计算机显示文字或者存储文字,就是一个查表的过程。
在计算机逐步发展的过程中,先后出现了几十种甚至上百种字符集,有些还在使用,有些已经淹没在了历史的长河中,
本节我们要讲解的是一种专门针对英文的字符集——ASCII编码。
拉丁字母(开胃小菜)
在正式介绍 ASCII 编码之前,我们先来说说什么是拉丁字母。估计也有不少读者和我一样,对于拉丁字母、英文字母和汉语拼音中的字母的关系不是很清楚。
拉丁字母也叫罗马字母,它源自希腊字母,是当今世界上使用最广的字母系统。基本的拉丁字母就是我们经常见到的
ABCD 等26个英文字母。
拉丁字母、阿拉伯字母、斯拉夫字母(西里尔字母)被称为世界三大字母体系。
拉丁字母原先是欧洲人使用的,后来由于欧洲殖民主义,导致这套字母体系在全球范围内开始流行,美洲、非洲、澳洲、亚洲都没有逃过西方文化的影响。中国也是,我们现在使用的拼音其实就是拉丁字母,是不折不扣的舶来品。
后来,很多国家对 26 个基本的拉丁字母进行了扩展,以适应本地的语言文化。最常见的扩展方式就是加上变音符号,例如汉语拼音中的ü,就是在u的基础上加上两个小点演化而来;再如,áà就是在a的上面标上音调。
总起来说:
基本拉丁字母就是 26 个英文字母;
扩展拉丁字母就是在基本的 26 个英文字母的基础上添加变音符号、横线、斜线等演化而来,每个国家都不一样。
ASCII 编码
计算机是美国人发明的,他们首先要考虑的问题是,如何将二进制和英文字母(也就是拉丁文)对应起来。
当时,各个厂家或者公司都有自己的做法,编码规则并不统一,这给不同计算机之间的数据交换带来不小的麻烦。但是相对来说,能够得到普遍认可的有 IBM 发明的 EBCDIC 和此处要谈的 ASCII。
我们先说 ASCII。ASCII 是“American Standard Code for
Information Interchange”的缩写,翻译过来是“美国信息交换标准代码”。看这个名字就知道,这套编码是美国人给自己设计的,他们并没有考虑欧洲那些扩展的拉丁字母,也没有考虑韩语和日语,我大中华几万个汉字更是不可能被重视。
但这也无可厚非,美国人自己发明的计算机,当然要先解决自己的问题
ASCII 的标准版本于 1967 年第一次发布,最后一次更新则是在 1986 年,迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是
1234567890)、标点符号(,.!等)、特殊符号(@#$%^&等)以及一些具有控制功能的字符(往往不会显示出来)。
在 ASCII 编码中,大写字母、小写字母和阿拉伯数字都是连续分布的(见下表),这给程序设计带来了很大的方便。例如要判断一个字符是否是大写字母,就可以判断该字符的
ASCII 编码值是否在 65~90 的范围内。
EBCDIC 编码正好相反,它的英文字母不是连续排列的,中间出现了多次断续,给编程带来了一些困难。现在连 IBM 自己也不使用 EBCDIC 了,转而使用更加优秀的 ASCII。
ASCII 编码已经成了计算机的通用标准,没有人再使用 EBCDIC 编码了,它已经消失在历史的长河中了。
ASCII 编码一览表
标准 ASCII 编码共收录了 128 个字符,其中包含了
33 个控制字符(具有某些特殊功能但是无法显示的字符)和 95 个可显示字符。
ASCII 编码一览表(淡黄色背景为控制字符,白色背景为可显示字符)
二进制 十进制 十六进制
00000000 0
00000001 1
00000010 2
00000011 3
00000100 4
00000101 5
00000110 6
00000111 7
00001000 8
00001001 9
00001010 10
00001011 11
00001100 12
00001101 13
00001110 14
00001111 15
00010000 16
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
NUL (NULL)
SOH (Start Of Headling)
STX (Start Of Text)
ETX (End Of Text)
EOT (End Of Transmission)
ENQ (Enquiry)
ACK (Acknowledge)
BEL (Bell)
BS (Backspace)
HT (Horizontal Tab)
LF/NL(Line Feed/New Line)
VT (Vertical Tab)
FF/NP (Form Feed/New Page)
CR (Carriage Return)
SO (Shift Out)
SI (Shift In)
DLE (Data Link Escape)
DC1/XON
(Device Control 1/Transmission On)
DC2 (Device Control 2)
DC3/XOFF
(Device Control 3/Transmission Off)
DC4 (Device Control 4)
NAK (Negative Acknowledge)
SYN (Synchronous Idle)
ETB (End of Transmission Block)
字符/缩写
空字符
标题开始
正文开始
正文结束
传输结束
请求
回应/响应/收到通知
响铃
退格
水平制表符
换行键
垂直制表符
换页键
回车键
不用切换
启用切换
数据链路转义
解释
00010001 17 11 设备控制1/传输开始
00010010 18 12 设备控制2
00010011 19 13 设备控制3/传输中断
00010100 20
00010101 21
00010110 22
00010111 23
14
15
16
17
设备控制4
无响应/非正常响应/拒绝接收
同步空闲
传输块结束/块传输终止
00011000 24
00011001 25
00011010 26
00011011 27
00011100 28
00011101 29
00011110 30
00011111 31
00100000 32
00100001 33
00100010 34
00100011 35
00100100 36
00100101 37
00100110 38
00100111 39
00101000 40
00101001 41
00101010 42
00101011 43
00101100 44
00101101 45
00101110 46
00101111 47
00110000 48
00110001 49
00110010 50
00110011 51
00110100 52
00110101 53
00110110 54
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
CAN (Cancel)
EM (End of Medium)
SUB (Substitute)
ESC (Escape)
FS (File Separator)
GS (Group Separator)
RS (Record Separator)
US (Unit Separator)
(Space)
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
取消
已到介质末端/介质存储已满/介质中断
替补/替换
逃离/取消
文件分割符
组分隔符/分组符
记录分离符
单元分隔符
空格
00110111 55
00111000 56
00111001 57
00111010 58
00111011 59
00111100 60
00111101 61
00111110 62
00111111 63
01000000 64
01000001 65
01000010 66
01000011 67
01000100 68
01000101 69
01000110 70
01000111 71
01001000 72
01001001 73
01001010 74
01001011 75
01001100 76
01001101 77
01001110 78
01001111 79
01010000 80
01010001 81
01010010 82
01010011 83
01010100 84
01010101 85
37
38
39
3A
3B
3C
3D
3E
3F
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
01010110 86
01010111 87
01011000 88
01011001 89
01011010 90
01011011 91
01011100 92
01011101 93
01011110 94
01011111 95
01100000 96
01100001 97
01100010 98
01100011 99
01100100 100
01100101 101
01100110 102
01100111 103
01101000 104
01101001 105
01101010 106
01101011 107
01101100 108
01101101 109
01101110 110
01101111 111
01110000 112
01110001 113
01110010 114
01110011 115
01110100 116
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
V
W
X
Y
Z
[
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
01110101 117
01110110 118
01110111 119
01111000 120
01111001 121
01111010 122
01111011 123
01111100 124
01111101 125
01111110 126
01111111 127
75
76
77
78
79
7A
7B
7C
7D
7E
7F
u
v
w
x
y
z
{
|
}
~
DEL (Delete)
删除
上表列出的是标准的 ASCII 编码,它共收录了 128 个字符,用一个字节中较低的 7 个比特位(Bit)足以表示(27 =
128),所以还会空闲下一个比特位,它就被浪费了。
如果您还想了解每个控制字符的含义,请转到:完整的ASCII码对照表以及各个字符的解释
ASCII 编码和C语言
稍微有点C语言基本功的读者可能认为C语言使用的就是 ASCII 编码,字符在存储时会转换成对应的 ASCII 码值,在读取时也是根据 ASCII 码找到对应的字符。这句话是错误的,严格来说,你可能被大学老师和C语言教材给误导了。
C语言有时候使用 ASCII 编码,有时候却不是,而是使用后面两节中即将讲到的 GBK 编码和 Unicode 字符集,我
们将在《C语言到底使用什么编码?谁说C语言使用ASCII码,真是荒谬!》一节中展开讲解。
版权声明:本文标题:ASCII编码,将英文存储到计算机 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1704306821h454034.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论