复杂语言处理为什么那么难?
作为程序员,是可能听到过复杂语言处理这个概念的。但是,这东西对于普通用户来说也是重要的。只不过,程序员有时候需要考虑的是该如何依照规则实现出相应的功能。而对于普通用户,需要知道的是电子时代的计算机在处理文本上该有什么规则。
先说普通用户。在电脑上碰到的UI就难逃文字。如果这个用户想学一些外语,那么多半会碰到语言输入的问题。比如在我上大学的时候,学校的公共机房就有南极星软件,现在想来大概就是学校日语专业的人需要用的。那么在广泛一点,学泰语的,高棉语的,僧伽罗语的,梵语的,阿拉伯语的,古叙利亚语的,实际上都有可能碰到各种各样的文字处理问题。包括但不限于:输入,排版,混排。
理论上看来,我们这个时代连Unicode都有了,那问题似乎应该都被解决了吧?!
并不是,从Unicode的细节来看,它的core specification已经是细节丰富的东西了。但是在真正的使用场景中,有时可能只是涉及皮毛。而且Unicode并不是闭门造车,而是兼容并包的,这个兼容并包的含义,就是说,你原来处理那些Unicode之外的经验,大多还是要用上的,甚至还要在某种程度上进化一些。
而且,从某个角度上看,Unicode并不一定是终极目标,虽然它在很大程度上确实有一定的终极性。这其实就是我,作为一个TeX开发者,经常给别人说的,排版模型,限制大致上是以Unicode为主要目标,但它不应该作为排版的终极目标来看,即使是最早的8bit时代的一些东西,也是有一定意义的。甚至在都有可能讨论不上谁先进谁落后的。
从开发者的角度上看,这种文本处理的东西已经能够让程序员盘桓数年而出不来了。那么对于普通用户似乎就更不友好了。
但,总有好消息,毕竟难的东西,一旦碰了一次,虽然以后还会碰到更多的困难,但解决上大概就没什么阻碍了,所谓一通百通。
先说复杂语言。从字面上看,复杂,其实是相对于拉丁字母的体系说的。拉丁字母体系之外的难啊,各有各的难处。比如说,汉字之多,甚至现在的OpenType都装不下。比如,汉字变体之多,现在有时会有六种以上。比如,阿拉伯语或者希伯来语,要从右往左书写。比如,南亚的文字,语音顺序和字的顺序相异。比如,有些南亚文字会让文字处理软件的行高长高,甚至理论上可以无限长。
解决这些问题,实际上需要下面的知识:1. 语言学(书写系统);2. 计算机,尤其是涉及到文字处理的各种算法,编码和体系化的知识,如编译器设计;3. 统计学,尤其是大量的语料。
作为TeX开发者,我这些年其实就是在跟这些东西作斗争。难的倒不是找到这些学科的材料。难的地方主要在于,从这些跨学科的知识里面,找到关联,统一和对立。很不幸,这东西花掉了我很多的时间。但是幸运的是,我对于这些东西的想法已经大概完善。
从结果上看,将会是:一个文档,来抽出必要的知识点,整理出逻辑;一个字体,它并不是实际使用的字体,而更像是一个有验证意义的一个工具;一个库或者编译器,用来对应前两项的,最后会用在我自己的TeX里(为了去除harfbuzz,我挣扎了多少年啊)。
下期待续。