Skip to content

用数字表示文字

我们要用数字来表示文字。

为什么要这样做呢?因为我们很快就要接触计算机,也就是所谓的“电脑”了。

见名知义,计算机首先是用来“计算”的。要对什么东西做“计算”呢?自然是“数”。

现代计算机的思路便是将一切都表示成数。文字可以表示成一连串的数,图片也可以表示成一连串的数,视频也可以。这样一来,计算机就有着充足的能力来表示和处理它们了。

文字是我们经常接触的、结构很简单的东西。(至少表面上看起来是这样。)接下来的编程教程也经常要和文字打交道。我们不妨先看一看,文字是怎么被表示成数的。

一段英文文字

所以我们现在先考虑最简单的问题:如何将下面一串英文文本表示成一连串的数?

It's me.
My name is LS_Hower.

我们先用这么一个纯英文例子入手,不仅因为英文所使用的拉丁字母数量少,还因为研究有着异域风情的文字(拉丁字母)而不是汉字说不定可以让我们更专注于它如何被表示。

我们发现,所谓的文字竟然是由一个个字母和标点符号拼起来的!(我去,不早说!)

我们不妨把字母和标点符号统称为字符。比如说,字母“t”是一个字符,符号“.”也是一个字符。

我们让每一个字符对应一个非负的整数(之后会简称为“整数”),我们就能用一连串的整数来表示一段文字了。我们不妨现在就设计一套表示方式。

先让小写字母对应 1 至 26:

字符 整数
a 1
b 2
c 3
z 26

再让大写字母对应 27 至 52:

字符 整数
A 27
B 28
C 29
Z 52

我们还得让单引号 ' 、句点 . 、下划线 _ 还有空格这 4 个特殊字符对应上自己的整数,因为刚才的文字里用到它们了。不妨就直接顺着刚才的整数吧:

字符 整数
' 53
. 54
_ 55
(空格) 56

所以我们可以试着把“It's me.”这个句子转换成一连串的整数了。按照刚才的表格,因为:

  • I 对应 35;
  • t 对应 20;
  • ' 对应 53;
  • s 对应 19;
  • 对应 56;
  • m 对应 13;
  • e 对应 5;
  • . 对应 54;

所以我们可以用一个整数数列:

\[35, 20, 53, 19, 56, 13, 5, 54\]

来表示这句 It's me. 了。

同理,我们可以用这个整数数列:

\[39, 25, 56, 14, 1, 13, 5, 56, 9, 19, 56, 38, 45, 55, 34, 15, 23, 5, 18, 54\]

来表示 My name is LS_Hower. 这句话。读者可以自行验证。

不过这两句话位于两个不同的行,它们之间是应当隔着一个“换行”的。我们不妨给“换行”也分配一个整数,57。

所以,我们就可以只用一串整数将这一整段话表示出来了:

\[ \begin{gather*} 35, 20, 53, 19, 56, 13, \\ 5, 54, 57, 39, 25, 56, \\ 14, 1, 13, 5, 56, 9, \\ 19, 56, 38, 45, 55, 34, \\ 15, 23, 5, 18, 54 \\ \end{gather*} \]

注意这里用到了一个 \(57\) 。在它之前是本节开始那段话第一行的内容,在它之后是第二行的内容。

“换行”看起来好像不太像传统意义上的“字符”,它更像是来控制我们的文字要以怎样的方式显示的。但它的地位确实和其他字符是一样的,有自己所对应的一个整数。“换行”是一种 控制字符

一段带有数字的英文文字

考虑下面这段话:

He is 67 years old.

这里出现了新的字符,分别是 67 。我们需要扩展一下我们刚刚的表格了。

阿拉伯数字也不过只有 10 个罢了,分别是 0 1 2 3 4 5 6 7 8 9 。它们只不过也是 10 个字符罢了。我们给它们也各自分配一个整数即可,如下:

字符 整数
0 58
1 59
2 60
3 61
4 62
5 63
6 64
7 65
8 66
9 67

既然字符 6 对应的整数是 64,字符 7 对应的整数是 65,那么刚刚这句话就也可以用一串整数表示出来了:

\[34, 5, 56, 9, 19, 56, 64, 65, 56, 25, 5, 1, 18, 19, 56, 15, 12, 4, 54\]

一段中文文字

考虑这样一段中文文字:

你好,我是 LS_Hower。

英文字母、数字和符号加起来好像也就不过一百个,但是汉字有数万个甚至多于十万个。如果为它们一一分配整数,这个整数在后期就要达到几万的级别了。

真的要这样做吗?当然!

我们现在就分配一下整数吧:

字符 整数
1000
1001
1002
1003
1004
1005

那么刚才这段话也不难了:

\[1002, 1003, 1000, 1004, 1005, 56, 38, 45, 55, 34, 15, 23, 5, 18, 1001\]

我们让汉字对应的整数的所在范围(区间)和英文对应的整数的范围不重叠,那么我们就可以放心地表示中英混用的文章。推广一下,对于其他各国文字,如希腊字母和俄文字母,还有日文假名等等,我们也都可以一一分配整数。只要保证不会有撞车,那么我们就可以用整数的数列来表达世界上一切文字了。

(什么,你说阿拉伯文从右往左写所以好像会比较棘手?好吧,确实比较棘手,但是这属于深入钻研的时候才需要考虑的问题了。)

ASCII 与 Unicode

总结一下:选定一些字符,给每一个都字符分配一个非负整数,这样一来,用一串非负整数就能表示一段文字了。

以上思路是早在几十年前就成形了的。我们选定的这些字符所构成的集合称为 抽象字符表 ,而让每个字符对应一个非负整数之后,我们得到的就是一个 编码字符集

显然,每个人或者团体都发明自己的一套编码字符集并不是一件好事,这会让交流和沟通变得极其困难。此时就需要一个行业标准。

于是,在 1963 年,美国国家标准协会(ANSI)从当时的电报码出发,制定并推出了一套编码字符集标的的第一版。这个编码字符集称为 ASCII (美国信息交换标准代码,American Standard Code for Information Interchange)。

ASCII 只选取了 128 个字符,并让它们对应了从 0 到 127 这个范围内的整数。具体内容如下:

TODO: 继续