计算机存储文字的方法,是给每个字符一个数字,称为字符编码(character code),再把这个数字以二进制存储。ASCII 或 Unicode 这样的字符集,就是把字符和编码对应起来的公认表格。
考试题通常会给出一两个编码,要你求出其他的,把它们转成二进制,或解释为什么需要更大的字符集。这一课属于数字与文字的表示,并依靠二进制与十进制互换。
怎样根据给出的例子算出编码?
字母按字母表顺序存储,所以编码是连续的。如果题目说 A 是 65,那么 B 是 66,C 是 67,依此类推。要求某个字母,数一数它在 A 之后几个位置,再加到 65 上。
| 字母 | A 之后的位置 | 编码 |
|---|---|---|
| A | 0 | 65 |
| B | 1 | 66 |
| C | 2 | 67 |
| G | 6 | 71 |
| O | 14 | 79 |
小写字母的想法一样。如果 a 是 97,那么 e 是 97 + 4 = 101。
ASCII 和 Unicode 有什么区别?
ASCII 每个字符用 7 位,所以有 27 = 128 个不同的编码。这足够容纳英文字母、数字、标点和一些控制码,却不够容纳其他文字系统的字符。扩展版本用 8 位,有 256 个编码。
Unicode 每个字符用更多的位,所以能容纳多种语言的字符,还有符号和表情符号。学生在信息里写“你好”就需要 Unicode,因为 ASCII 没有这些字符的编码。Unicode 的前 128 个字符与 ASCII 编码相同,所以旧的文字仍然可用。
代价是存储:每个字符用的位越多,同样字数的文件就越大。
示范例子
题目告诉你,大写字母 A 的 ASCII 编码是 65。
(a) 解码 71 和 79。
71 − 65 = 6,所以这个字母在 A 之后 6 个位置。A、B、C、D、E、F、G:是 G。
79 − 65 = 14,在 A 之后 14 个位置,是 O。这个单词是 GO。
(b) 把 C 的编码写成 8 位二进制。
C 是 65 + 2 = 67。用位值:67 = 64 + 2 + 1,所以二进制是 01000011。检查:64 + 2 + 1 = 67。
(c) 小写字母 a 的编码是 97。小写 c 的编码是多少?为什么它和大写 C 不同?
小写 c 是 97 + 2 = 99,即 01100011(64 + 32 + 2 + 1 = 99)。它和 C(67)不同,因为大写和小写是不同的字符,各自需要自己的编码。相差 97 − 65 = 32。
要留意的错误
常见的失误是把字符和它的数值混为一谈。
题目: 键入字符 ‘7’。如果数字字符 ‘0’ 的编码是 48,存储的编码是多少?
错误答案: 7(或 00000111)。
字符 ‘7’ 是一个符号,有自己的编码:48 + 7 = 55,即 00110111(32 + 16 + 4 + 2 + 1 = 55)。数字 7 和字符 ‘7’ 是两回事,程序存储它们的方式不同。一个好的判断方法是问:这个 7 是要拿来计算,还是只当文字显示。
自我检查
1. 已知 a 是 97,e 的编码是多少?
查看答案
e 在 a 之后 4 个位置,所以 97 + 4 = 101。
2. 已知 A 是 65,求 J 的编码,并写成 7 位二进制。
查看答案
J 是第 10 个字母,在 A 之后 9 个位置:65 + 9 = 74。二进制:74 = 64 + 8 + 2,所以是 1001010(7 位)。检查:64 + 8 + 2 = 74。
3. 为什么通讯软件需要 Unicode,而不能只用 7 位 ASCII?
查看答案
7 位 ASCII 只有 128 个编码,不够容纳中文、泰米尔文或阿拉伯文等其他语言的字母,也不够容纳表情符号。Unicode 每个字符用更多的位,所以能给它们每一个单独的编码。
接下来学什么
下一课位深度与可表示的值会把“有多少个编码”这个问题一般化。你可以在综合练习里检验自己。老师可以在线上一对一 Computer Science 补习中帮你写出简短又准确的解释。