无字库技术及其意义

 

    现在的电脑,处理文字时都离不开字库。在文本文件中,存贮的是一串内码,一个内码对应着字库里唯一的一个字形。每个字形虽然形状不同,但都呈大小一致的矩形,文本或文字串就是由它们线性排列形成的。对这种形式的文章,电脑技术可以进行快速高效的编辑:删除、插入、查找、置换、朗读、校对和排版,进一步还能从大量文章中检索、提取,甚至能理解文意。所有这一切都是继承印刷技术后,再发展而成的。在活字印刷里,不同的字必须有不同的铅字字模,而且每种字模都必须是大量的,以备排版之需要。在电脑里,由于字形字模的拷贝是很容易的,一个字只要一个字模就足够了,不过要给它一个独一无二的内码,以便取到这个字形。这些字形的集合就形成字库,对应于活字印刷里大量铅字库。虽然电脑字库比铅字库简小而方便,但在每次阅读时都必须带着,如果字库里的一个字形有了变化,整篇文章里的这个字的字形都会改变,如果缺了一个字,就成为空白。没有了字库或安装错了,就不能正确显示,成了无意义的乱码。

    电脑是西方发明的,开始只使用英文,安装了ASCII码字库。它们不到100个,可以一键对应一个字符,不要另外的输入法。内码安排在32到127之间,只要一个字节。因为这第一个字库很小,用当时简单的点阵字形,字库大小不到1K,就直接放在BIOS中,一启动就可显示了。它们的显示程序也特别简单,只用几句汇编语言,每个字母只要把8字节的点阵数据复制到表示屏幕的内存(显存)里就可以了。

    汉字数量比字母多几百到上千倍,1980年的第一个国标码字库取了6763个汉字,其内码至少要两个字节。因为必须保证ASCII字符能正常使用,不发生冲突,所以只使用字节高位为1的161到254的值,即每字节只有94个,这就是区位码的来历,高字节表示区,低字节表示位。每个汉字字模的数据,又比每个字母多4倍,所以这个字库大小达240K左右。在上世纪80年代,这个字库是太大了,更主要的还可能是软件的版权问题,它一直没有进入BIOS。于是,汉卡就应运而生,固化在汉卡里的字库数据,读写(指写到显存,显示字形)都快,且一启动就可使用。后来因为硬件的快速进步,计算机的内存由几百K增加到几M以后,软字库可以一次读入内存,硬字库汉卡才退出历史舞台。

    我是在1985年提出无字库技术的,而且是在内存只有18K的袖珍计算机上实现的。当时,这个技术对微机应该也是有用的。记得比IBM微机低档的苹果机,只能用台湾朱邦复先生的汉字系统,他应用字形复用技术,字库大小降低为四分之一。字形复用,就是用其他笔画较少的汉字组成新汉字。这种组字技术也是无字库技术的核心,不过它是直接由笔画来组字,或者先组成字根,再由字根来组字,因而可以不要任何字库字。

    当内存增加到连汉卡也失去意义后,用无字库技术来降低内存的开消,在一般微机里就没啥意义了。不过,在较小的嵌入式系统中,例如目前大多数仪器用的的液晶显示及手机等,为了节省存贮空间,还是有作用的。另外,随着用电脑处理汉字的飞速发展,仍存在并突显以下五个方面的问题,需要用无字库技术才能解决。

    1、随着文字工作的发展,要用的汉字愈来愈多,虽然字库也不断增大,现在已达7-8万了,还是有缺字,使一些人的名字打不出来,甚至办不成第二代身份证。

    2、汉字输入都要使用某种输入法,字库不断扩大,研制输入法愈来愈困难,以致现在万码奔腾,还是没有公认的好方法:既好学又能输入所有冷僻字。因为汉字多,键盘小,显然不能一键一字,必须连按数个键的组合才能输入一个汉字的内码。又因为汉字至今没有科学的自然排序方法,内码是人为规定的流水码,输入法要建立键的组合与汉字内码的一一对应关系,几乎不可能,所有输入法都要辅以从提示栏选择。形码选择量少(即重码率低),但难学难记;对于年轻人,音码几乎都会,但输入速度慢,碰到不会读的字就没办法了。无论用现在的那种输入法,长期打字不熟识汉字结构,许多汉字都不会写了。

    3、能使用的汉字必须是字库里有的,虽然电脑也能够造字,但新造的字只能在你的机子上用,不能流通。这样一来,汉字再也不能发展了,而任何事物一旦殭化,最后必然导至死亡。

    4、字库太大,容易出错,现在已有网友发现所谓的电脑错字。按现在的硬件技术,内存里装多大的字库都没问题,但是,万一某个字模的数据错了一点,这个字就不能正确显示了。常常碰到这样的情况,一篇文章在一种字体下,显示是正常的,但换了另一种字体,有些字,甚至不是冷僻字,也会成为空白,因为这种字体里没有它的数据。

    5、二十多年前,我就提出研制真正的汉字电脑,认为现在的电脑虽然能够处理汉字,但都不是汉字电脑。这首先影响到中国人的学习使用。因为电脑出了深层问题时,最后都要显示大量英文信息,不精通英语的人看不懂,要掌握高深的电脑技术是不可能的。现在虽然大部分人都学过或正在学习英文,但能够看懂这些英文提示的人可能只有百分之一,甚或千分之一。西文电脑还影响国家的安全。因为大部分软件,尤其是基础软件,都是微软一统天下,它可以隐含窃听程序,收集我们的资料。我们虽然也研制了中文操作系统以至中文CPU(但是底层似乎还仍是英文的),至今还没有得到推广。

    以上所有这些问题,采用无字库技术,都可得到解决。

    不要汉字字库,只需要几十个(我现在用50个)笔画数据。如果键入的都是笔画码,可以一键一码,且直接作为汉字内码。因为汉字笔画太多,这种直接方式,输入慢,内码太长,不实用。所以要先组成字根和少量汉字供调用,这就是说要一个小字库。小字库内的汉字当然只选用高频字,大小取2000到3000个。因为2000个高频字的使用频率合计达98%以上,研制这几个汉字的符合汉字组字原理的输入法,不困难,可优化固定。而另外百分之一的汉字,称为合成字,其内码由笔画字根串组成,码长长一些也关系不大。作为试验或过渡,我现在编研的小字库WORD 2.0版,干脆可使用所有字库字,也可用字库字进行组字。这样,只有字库里没有的汉字,或者实在输不进去的汉字,才使用合成字。

    要由合成字的“内码”(实际是字符串)来显示汉字,需要一个显示子程序,它要按该字符串(内码)调用相应的笔画、字根或字库字的数据。当然,所有合成字都是调用这同一子程序,只不过程序相当复杂而已。对于以前的点阵字库,显示程序很简单,把字模的数据拷贝到显存就可以了。对于现在的矢量字库,虽然我至今没看到有关资料,不甚了解,估计显示程序也应该相当复杂。因为矢量字库里存的是字形的轮廓线,轮廓线数据只能是折线的转折点,折线要经过平滑化,画好平滑轮廓线后,还要进行填充。这些显示子程序都是优化的高效的汇编程序,放在基础软件(BIOS或操作系统)里。但是,我现在只能把它放在我的试验软件里,而且是用高级语言VB编成的,没有优化,速度较慢。

                               2007.9.12