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*3的点码单元中的一个或者多个凸起的点。这个点码单元包含的点通常用1到6的数字进行编号。
1 | ○ | ○ | 4 |
2 | ○ | ○ | 5 |
3 | ○ | ○ | 6 |
在现代应用中,使用特殊的打印机或轧花机可以将布莱叶盲文印到纸张上。
即使只是用布莱叶盲文在本书中印上几页,造价也实在是有点高,所以我在书中使用一和符号来表示布莱叶盲文。在这种表示方法中,点码单元所有的6个点都会被表示出来。大点表示这是一个凸起的点,小点则表示其对应的位置是平的。例如,下面的布莱叶盲文:
●♥ | • |
• | ●♥ |
●♥ | • |
其中,第1, 3, 5点是凸起的,而2,4, 6点的位置是平的。
令我们感兴趣的是,这些点码都是二进制的。一个单独的点不是平的就是凸起的。也就是说我们可以把莫尔斯编码中学到的知识应用到布莱叶盲文的分析中!我们现在已经知道,每组有62上点,并且每个点有平和凸两种状态,因此6个可平要凸的点的组合数就是2*2*2*2*2*2,即26,也就是64。
因此,布莱叶盲文系统能够表示64个不同的码字。下图就是所有可能的64种码字。
•• •• •• |
•♥ •• •• |
•• •♥ ••
|
•♥ •♥ •• |
•• •• •♥ |
•♥ •• •♥ |
•• •♥ •♥ |
•♥ •♥ •♥ |
♥• •• •• |
♥♥ •• •• |
♥• •♥ ••
|
♥♥ •♥ •• |
♥• •• •♥ |
♥♥ •• •♥ |
♥• •♥ •♥ |
♥♥ •♥ •♥ |
•• ♥• •• |
•♥ ♥• •• |
•• ♥♥ •• |
•♥ ♥♥ •• |
••
♥• •♥ |
•♥ ♥• •♥ |
•• ♥♥ •♥ |
•♥ ♥♥ •♥ |
♥• ♥• •• |
♥♥ ♥• •• |
♥• ♥♥ •• |
♥♥ ♥♥ •• |
♥•
♥• •♥ |
♥♥ ♥• •♥ |
♥• ♥♥ •♥ |
♥♥ ♥♥ •♥ |
•• •• ♥• |
•♥ •• ♥• |
•• •♥ ♥• |
•♥ •♥ ♥• |
•• •• ♥♥ |
•♥ •• ♥♥ |
•• •♥ ♥♥ |
•♥ •♥ ♥♥ |
♥• •• ♥• |
♥♥ •• ♥• |
♥• •♥ ♥• |
♥♥ •♥ ♥• |
♥• •• ♥♥ |
♥♥ •• ♥♥ |
♥• •♥ ♥♥ |
♥♥ •♥ ♥♥ |
•• ♥• ♥•
|
•♥ ♥• ♥• |
•• ♥♥ ♥• |
•♥ ♥♥ ♥• |
•• ♥• ♥♥ |
•♥ ♥• ♥♥ |
•• ♥♥ ♥♥ |
•♥ ♥♥ ♥♥ |
♥• ♥• ♥• |
♥♥ ♥• ♥• |
♥• ♥♥ ♥• |
♥♥ ♥♥ ♥• |
♥• ♥• ♥♥ |
♥♥ ♥• ♥♥ |
♥• ♥♥ ♥♥ |
♥♥ ♥♥ ♥♥ |
假如发现布莱叶盲文中用到的码字数目少于64,就会有人问了,为什么64个可能的码字中有一些被遗弃不用呢?假如我们发现布莱叶盲文中用到的数目超过64,问题就更严重了,我们会怀疑自己的智商,甚至怀疑基本的数学原理——到底2加2是不是等于4。
还是让我们来开始解析布莱叶盲文吧,首先看看基本的小写字母表。
♥• •• •• a |
♥• ♥• •• b |
♥♥ •• •• c |
♥♥ •♥ •• d |
♥♥ •♥ •• e |
♥♥ ♥• •• f |
♥♥ ♥♥ •• g |
♥• ♥♥ •• h |
•♥ ♥• •• i |
•♥ ♥♥ •• j |
♥• •• ♥• k |
♥• ♥• ♥• l |
♥♥ •• ♥• m |
♥♥ •♥ ♥• n |
♥• •♥ ♥• o |
♥♥ ♥• ♥• p |
♥♥ ♥♥ ♥• q |
♥• ♥♥ ♥• r |
•♥ ♥♥ ♥• s |
•♥ ♥♥ ♥• t |
♥• •• ♥♥ u |
♥• ♥• ♥♥ v |
♥♥ •• ♥♥ x |
♥♥ •♥ ♥♥ y |
♥• •♥ ♥♥ z |
例如,词组“you and me”用布莱叶盲文表示:
♥♥ •♥ ♥♥ |
♥• •♥ ♥• |
♥• •• ♥♥ |
♥• •• •• |
♥♥ •♥ ♥• |
♥♥ •♥ •• |
♥♥ •• ♥• |
♥♥ •♥ •• |
||||
y | o | u | a | n | d | m | e |
注意, 一个单词中每个字母所对应的点码单元之间都用一小块空白分开;而单词之间则用一大的空格(实际上是没有凸点的点码单元)所分隔开来。
这就是路易斯.布莱叶制定的盲文的基本规范,至少它对于拉丁字母很适用。布莱叶还制定了表示重音符号的编码,这在法语中要经常用到。注意这里没有"W"这个字母的编码,因为在传统的法语中不会用到它(别担心,这个字母最后会出现的,下文将作讲解)。到此为止,64个码字中只使用了25个。
经过仔细的检查, 你会发现,从我们列举的那三排布莱叶盲文的例子(小写字母表)中,可以总结出一个规律。每一排(字母a到j)只用到了点码单元中最上面的四个点----第1、 2、 4和5点。 第二排在复用了第一排的编码的基础上,把第3点改为凸点。第三排也沿用了同样的规律,只是将第3和6点改为凸点。
自从路易斯.布莱叶发明布莱叶盲文以来,其应用已经扩展到了各个领域。目前在英文出版物中最常见的盲文系统称为二级布莱叶盲文(Grade 2 Braille)。 二级布莱叶盲文使用了很多缩写,以便于保存树型结构和提高阅读速度。 例如,如果字母的码字单独出现,它们就是一个普通的单词,以下三排图样(包含“完整的”每三排)为我们展示了这些单词的码字。
♥• •• •• (none) |
♥• ♥• •• but |
♥♥ •• •• can |
♥♥ •♥ •• do |
♥♥ •♥ •• every |
♥♥ ♥• •• from |
♥♥ ♥♥ •• go |
♥• ♥♥ •• have |
•♥ ♥• •• (none) |
•♥ ♥♥ •• just |
♥• •• ♥• knowledge |
♥• ♥• ♥• like |
♥♥ •• ♥• more |
♥♥ •♥ ♥• not |
♥• •♥ ♥• (none) |
♥♥ ♥• ♥• people |
♥♥ ♥♥ ♥• quite |
♥• ♥♥ ♥• rather |
•♥ ♥♥ ♥• so |
•♥ ♥♥ ♥• that |
♥• •• ♥♥ us |
♥• ♥• ♥♥ very |
♥♥ •• ♥♥ it |
♥♥ •♥ ♥♥ you |
♥• •♥ ♥♥ as |
♥♥
♥• ♥♥ and |
♥♥ ♥♥ ♥♥ for |
♥• ♥♥ ♥♥ of |
•♥ ♥• ♥♥ the |
•♥ ♥♥ ♥♥ with |
因此,短语“you and me ”使用二级布莱叶盲文就可以表示为:
♥♥ •♥ ♥♥ |
♥♥ ♥• ♥♥ |
♥♥ •• ♥• |
♥♥ •♥ •• |
||||
you | and | m | e |
到目前为止,我们已经描述了31个码字——单词间的大空格(即没有凸起的点码单元)以及总共3排每排10个字母和单词码字。与理论上可以达成到的最多码字数——64相比,我们还差得远呢。正如从下面的分析中我们将看到的那样,在二级布莱叶盲文里,没有任何的码字会被浪费。
首先, 我们可以使用字母a到j的码字加6号凸点的组合。这些码字通常用来表示单词中字母串缩写,还有我们前面所担心的w字母(像上文的二级布莱叶盲文单词编码一样,表示w字母的编码也可以表示一个单词)。
♥• •• •♥ |
♥• ♥• •♥ |
♥♥ •• •♥ |
♥♥ •♥ •♥ |
♥• •♥ •♥ |
♥♥ ♥• •• |
♥♥ ♥♥ •♥ |
♥• ♥♥ •♥ |
•♥ ♥• •• |
•♥ ♥♥ •♥ |
ch | gh | sh | th | wh | ed | er | ou | ow | w |
will |
例如,单词“about”使用二级布莱叶盲文可以记作:
♥• •• •• |
♥• ♥• •• |
♥• ♥♥ •♥ |
•♥ ♥♥ ♥• |
||||||
a | b | ou | t |
然后,我们取从a到j的码字,“降低”它们使用的点位,只用到编号为2,3, 5 和 6 的点,这样就得到了新的码字。根据上下文环境,它们将被用来表示一些标点符号或者字符串缩写。
•• ♥• •• |
•• ♥• ♥• |
•• ♥♥ •• |
•• ♥♥ •♥ |
•• ♥• •♥ |
•• ♥♥ ♥• |
•• ♥♥ ♥♥ |
•• ♥• ♥♥ |
•• •♥ ♥• |
•• •♥ ♥♥ |
|||||||||
ea | bb | cc | dis | en | to | gg | his | in | was | |||||||||
, | ; | : | . | ! | () | " | " |
前4个码字分别表示逗号、分号、冒号和句号。需要注意的是,左右括号使用的是相同的码字,但是开闭引号却是不同的码字。
目前为止我们已经定义了51个码字。“占用3,4, 5 和 6 号点”的码字还有很多组没有被定义,下面的6组就是这些被遗漏的码字,我们也用它们来表示一些字符串缩写和其他标点符号。
•♥ ♥• •• |
•♥ •• ♥♥ |
•♥ •♥ ♥♥ |
•♥ •♥ ♥• |
•• ♥• •• |
•• ♥♥ •• |
||||||
st | ing | ble | ar | com | |||||||
/ | # | - |
表示字符串缩写“ble”的码字很重要,因为当它不是用来作为单词的一部分时,它的出现就意味着之后的码字应译为数字。表示数字的码字与表示字母a 到j 的码字是相同的
♥• •• •• |
♥• ♥• •• |
♥♥ •• •• |
♥♥ •♥ •• |
♥• •♥ •• |
♥♥ ♥• •• |
♥♥ ♥♥ •• |
♥• ♥♥ •• |
•♥ ♥• •• |
•♥ ♥♥ •• |
||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
因此,下面这组编码:
•♥ •♥ ♥♥ |
♥• ♥• •• |
♥• •♥ •• |
♥♥ ♥• •• |
|||
# | 2 | 5 | 6 |
如果你还要继续下去,那么我们还需要定义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 |
这串编码分别表示了一个大写字母标识符、字母l、缩写字符串o、字母i和s, 以及一个空格,再加一个大写字母标识符, 还有字母b、 r, a, i, l, l 和 e。 (在实际应用中,可能会把名字末尾不发音的2个字母省略掉,以进一步压缩编码)
综上所述,我们将6位二进制码(其实6个点)所能表示的全部64种可能的编码都罗列了一遍。而且这64组编码中有很大一部分,根据上下文的不同将有着双重身份。 尤其值得注意的是数字标识符和取消“数字标识状态”的字母标识符。它们改变了后面编码的意义——从表示字母到表示数字,又从表示数字回到表示字母。像这样的编码通常被称作“优先码”(procedence codes)或者“换挡码”(shift codes)。它们改变着作用域内编码的含义,直到作用域结束。
大写字母标识符表示紧随它的字母(而且仅仅是紧随它的字母)应该被译为大写。类似这样的编码被称为“逃逸码”(escape codes)。 逃逸码让你“逃离”对编码串单调的、一成不变的解析,而转入一种新的解析方式中。 在以后的章节中我们将看到,在使用二进制码对书面语言进行编码时,换挡码和逃逸码是相当常见的。