第3章 布莱叶盲文与二进制码
塞缪尔·莫尔斯并不是第一个将书面语言的字母成功编码的人。实际上,在因为自己的名字被用来命名某种编码方式而名声大噪的人中,莫尔斯先生也不是第一人。这些荣誉应该归一个法国盲人小伙子所有。尽管他比莫尔斯要晚出生 18 年,但是他很早就创建了自己的编程规范。他的生平鲜为人知,尽管关于他的故事流传至今的位数不多,但这也足以构成一个引人注目的传奇。
路易斯·布莱叶(Louis Braille)于 1809 年生于法国的库普雷,这是一个距离巴黎市东只有 25 英里的小镇。布莱叶的父亲是一个马具匠人。在布莱叶 3 岁的时候——一个本不该在父亲的工作间玩耍的年纪——他不小心被一个尖锐的工具刺伤了一只眼睛。伤口感染也影响到了他的另外一只眼睛,最后使他的双目完全失明。按常理,布莱叶将在无知和贫困当中度过自己的一生(就像当时大部分盲人那样),但是小路易斯对知识的渴望和过人的智慧很快被人们发现。他最初同其他孩子一样在小镇上的小学上学,后来在他 10 岁的时候,在小镇牧师和一名学校老师的帮助下,布莱叶被送往巴黎皇家盲人学校学习。

很显然,盲人教育中一个主要的障碍就是盲人无法阅读印刷的书籍。瓦伦丁·霍伊( 1745-1822 ),巴黎皇家盲人学校的创始人,曾发明过一种在纸面上印下凸起文字的系统,这样盲人就可以通过触摸的方式来进行阅读了。但是这种文字系统使用起来很困难,而且使用这种方法来印刷的书籍也非常少。
霍伊先生视力健全,因此他被自身的感知模式所禁锢。对他来说,一个字母 A 就是一个 A,而且字母 A 在记录时也必须看起来(或者感觉起来)想一个 A(如果让他用手电筒交流的话,估计他会像我们最开始所做的那样,试图在空中比划出要表达的字母,但其实我们发现这法子根本不灵)。霍伊先生或许没有意识到,有一种完全不同于印刷字母的文字系统可能更加适合盲人阅读。
这种非常规编码方式的起源说出来可能有些出人意料。查尔斯·巴比尔(Charles Barbier),法国军队的一位军官,在 1819 年发明了一种他自称为 “écriture nocturne”(也叫“夜间书写”)的文字系统。他在厚纸上使用凸起的点和划的组合来表示文字,这样当部队需要无声交流的时候,即使光线很暗,士兵们也可以通过这些符号互相传递信息。他们使用一个锥形的铁笔在厚纸的背面书写,这样纸的正面就会有相应的凸起。然后人们就可以使用手指触摸这些凸起的点和划来进行阅读了。
巴比尔文字系统的缺点是太过复杂了。该系统并非使用与字母表相对应的点划编码串来表示字母,而是用与读音相对应的编码串表示,因此有时仅仅是为了表示一个单词,就不得不使用很多的码字。如果只是传递简短的消息,这个系统用起来倒还不错;但是在表示长文本的时候,就明显力不从心,就更别说用来对整本书进行编码了。
布莱叶在12岁的时候就很熟悉巴比尔的这种文字系统了。他特别喜欢使用凸起的点,不仅仅因为凸起的点通过手指就可以很容易实现阅读,还以为它们“写”起来也很简单。在教室里,一个盲人学生如果有了纸张和铁笔,他就可以做笔记,而且同时还能阅读记下来的文字。路易斯·布莱叶开始不辞辛劳地改进这个文字系统,3 年以后(那时他 15 岁)就创建成了自己系统,而这个系统中的一些基本规范,直到今天仍在被人们所使用。在很长一段时间内,这种新的文字系统只被他们学校内部的人们所熟悉,但是渐渐地,布莱叶盲文传播到了世界的各个角落。1835 年,路易斯·布莱叶患上了肺结核。1852 年,就在布莱叶 43 岁生日刚过完不久,病魔无情地夺走了他的生命。
如今,在引导盲人进入文字殿堂的道路上,改进后的布莱叶盲文系统与磁带录音书进行着竞争,但是布莱叶盲文仍然是不可替代的工具,特别是对于又聋又盲的人来说,布莱叶盲文仍然是他们开启阅读大门的唯一钥匙。近些年来,布莱叶盲文被越来越多地应用到公共场所中,使得盲人朋友们可以越来越方便地使用电梯、自动取款机等设备。
在这一章中我们将解析布莱叶盲文,来看看它是如何工作的。我们并不是要真的学习布莱叶盲文,而且也无须刻意记住什么关于它的内容。我们仅仅希望从中窥探到编码的一些本质。
在布莱叶盲文中,每个在书写文字中用到的符号——具体来说就是字母、数字和标点符号——都被编码成为 2 x 3 的点码单元中的一个或者多个凸起的点。这个点码单元包含的点通常使用 1 到 6 的数字来编码。

在现代应用中,使用特殊的打印机或轧花机可以将布莱叶盲文印到纸张上。
即使只是用布莱叶盲文在本书中印上几页,造价也实在是有点儿高,所以我在书中使用一种符号来表示布莱叶盲文。在这种表示方法中,点码单元中所有的 6 个点都会被表示出来。大点表示这是一个凸起的点,小点则表示其对应的位置是平的。例如,下面的布莱叶盲文:
其中,第 1,3,5 点是凸起的,而第 2,4,6 点的位置是平的。
令我们感到兴趣的是,这些点码都是二进制的。一个单独的点不是平的就是凸起的。也就是说我们可以把在莫尔斯编码中学到的知识应用到布莱叶盲文的分析中!我们现在已经知道,每组有 6 个点,并且每个点有平和图两种状态,因此 6 个可平可凸的点的组合数就是 2 x 2 x 2 x 2 x 2 x 2,即 2⁶,也就是 64.
因此,布莱叶盲文系统能够表示 64 个不同的码字。下图就是所有可能的 64 种码字。

假如发现布莱叶盲文中用到的码字数目少于 64,就会有人问了,为什么 64 个可能的码字中有一些被遗弃不用呢?假如我们发现布莱叶盲文中用到的码字数目超过 64,问题就更严重了,我们会怀疑自己的智商,甚至怀疑基本的数学原理——到底 2 加 2 是不是等于 4.
还是让我们来开始解析布莱叶盲文吧,首先看看基本的小写字母表。

例如,词组 “you and me” 用布莱叶盲文表示成如下组合:
![]()
注意,一个单词中每个字母所对应的点码单元之间都用一小块空白分开;而单词之间则用一个大的空格(实际上是没有凸点的点码单元)所以分隔开来。
这就是路易斯·布莱叶制订的布莱叶盲文的基本规范,至少它对于拉丁字母很适用。布莱叶还制订了表示重音符号字母的编码,者在法语中要经常要用到。注意这里没有 “w” 这个字母的编码,因为在传统的法语中不会用到它(别担心,这个字母最后会出现的,下文将作讲解)。到此为止,64 个码字只使用了 25 个。
经过仔细的检查,你会发现,从我们列举的那个三排布莱叶盲文的例子(小写字母表)中,可以总结出一个规律。第一排(字母 a 到 j )只用到了点码单元中最上面的四个点——第1、2、4 和 5 点。第二排在复用了第一排的编码的基础上,把第 3 点改为凸点。第三排也沿用了同样的规律,只有将第 3 和 6 点改为凸点。
自从路易斯·布莱叶发明布莱叶盲文以来,其应用已经扩展到各个领域。目前在英文出版物中最常用的盲文系统被称为二级布莱叶盲文(Grade 2 Braille)。二级布莱叶盲文使用了很多缩写,以便于保存树型结构和提高阅读速度。例如,如果字母的码字单独出现,它们就表示一个普通的单词。以下三排图样(包含“完整的”第三排)为我们展示了这些单词的码字。

因此,短语 “you and me” 使用二级布莱叶盲文就可以表示为:
![]()
到目前为止,我们已经描述了 31 个码字——单词的大空格(即没有凸点的点码单元)以及总共 3 排每排 10 个的字母和单词码字。与理论上可以达到的最多码字数——64 相比,我们还差得远呢。正如从下面的分析中我们将看到的那样,在二级布莱叶盲文里,没有任何的码字会被浪费。
首先,我们可以使用字母 a 到 j 的码字加 6 号凸点的组合。这些新码字通常用来表示单词中字母串的缩写,还有我们前面所担心的 w 字母(像上文的二级布莱叶盲文单词编码一样,表示 w 字母的编码也可以表示一个单词)。

例如,单词 “about” 使用二级布莱叶盲文可以记作:
然后,我们取从 a 到 j 的码字,“降低”它们使用的点位,只用到编号为 2、3、5 和 6 的点,这样就得到了新的码字。根据上下文环境,它们将被用来表示一些标点符号或者字符串缩写。

前 4 个码字分别表示逗号、分号、冒号和句号。需要注意的是,左右括号使用的是相同的码字,但是开闭引号使用的却是不同的码字。
目前为止我们已经定义了 51 个码字了。“占用 3、4、5 和 6 号点”的码字还有很多组没有被定义,下面的 6 组就是这些被遗漏的码字,我们也用它们来表示一些字符串缩写和其他的标点符号。

表示字符串缩写 “ble” 的码字很重要,因为当它不是用来作为单词的一部分时,它的出现就意味着之后的码字应被译为数字。表示数字的码字与表示字母 a 到 j 的码字是相同的。

因此,下面这组编码:
表示的就是数字 256。
如果你还要继续下去,那么我们还需要定义 7 个码字才算完全用满原有的 64 个码字。
![]()
第一个码字(4 号点凸起)用来表示音调符号(accent indicator)。其他的码字则用来表示缩写的前缀或者其他的功能:4 号和 6 号点凸起的码字(上表的第 5 个码字),根据上下文用来表示小数点或者强调符号(emphasis indicator)。5 号和 6 号点凸起的编码,表示与“数字标识符”相对应的“字母标识符”(letter indicator)。
最后(如果你现在还为布莱叶盲文如何表示大写字母忧心忡忡的话),我们还有 6 号凸点——大写标识符。这个符号表示它之后的字母将都被译为大写。例如,我们可以把这套文字系统的原创者的名字记做:
![]()
这串编码分别表示了一个大写字母标识符、字母 l、缩写字符串 ou、字母 i 和 s,以及一个空格,再加一个大写字母标识符,还有 b、r、a、i、l、l 和 e。(在实际应用中,可能会把名字末尾不发音的 2 个字母省略掉,以进一步压缩编码)
综上所述,我们将 6 位二进制码(其实是 6 个点)所能表示的全部 64 种可能的编码都罗列了一遍。而且这 64 组编码中有很大一部分,根据上下文的不同将有着双重身份。尤其值得注意的是数字标识符和取消“数字标识状态”的字母标识符。它们改变了后面编码的意义——从表示字母到表示数字,又从表示数字回到表示字母。像这样的编码通常被称作“优先码”(precedence codes)或者“换档码”(shift codes)。它们改变着作用域内编码的含义,直到作用域结束。
大写字母标识符表示紧随它的字母(而且仅仅是紧随它的字母)应该被译为大写。类似这样的编码被称为“逃逸码”(escape codes)。逃逸码让你“逃离”对编码串单调的、一成不变的解析,而转入一种新的解析方式中。在以后的章节中我们将看到,在使用二进制码对书面语言进行编码时,换档码和逃逸码是相当常见的。
