说说“汉卡”的进化史

看到有人说“汉卡”,勾起了陈年的记忆。原帖已经消失,干脆直接发新主题说几句。

“汉卡”一词的含义,其实有一个历史演变的过程,不同时期的“汉卡”对应的意义是大相径庭的。汉卡的诞生及演变,又与当时的电脑主机密切相关。

最早的IBM-PC是没有汉字的,为了让电脑能显示及处理汉字,国内若干单位投入力量进行了“汉化”,技术路线上又分成了软、硬两派,其中的典型代表分别是电子工业部第六研究所的CCDOS和长城电脑的汉卡。

原版PC的图形显示很简单,在文本模式下,只要往内存0xB0000开始的“屏幕缓冲区”的某个地址写入一个ASCII代码,屏幕上就会在相应的位置自动显示出来一个实际的字符,它如此实现的背后是从设计之初给予保障的:缓冲区的字符关联到了字符发生器,发生器里边保存着每个字符的图形点阵,硬件逻辑使得这些点阵可以受控地影射到“显卡”的特定地址、并最终在屏幕上显示出来。当然,那时还没有显卡的概念。

显然,这样的显示方式非常的快捷。软件只需往屏幕缓冲区写入ASCII码,屏幕上就会显示出对应的图形。这在CPU慢腾腾的早期,保证了良好的显示效果。 

CCDOS是纯软件方式实现的汉字显示:首先把系统切换到图形模式,然后从软件自带的汉字图形库中取出某个汉字的点阵数据,一笔一划地复制到屏幕缓冲区的对应位置。一个汉字的点阵是16×16,占用32个字节储存空间,显示过程是一次往缓冲区写入一个字节、即8个像素点的数据,如此重复32次完成一个汉字的写入。显然,这样的过程比英文字符的显示就慢了太多太多,以至于肉眼都可以清楚地看到屏幕更新的过程,而不同于英文显示的一瞬间完成。

纯软件方式实现了汉字的显示,但也带来两个主要的问题。一个是显示太慢,再一个就是因为早期的屏幕只有320×200的分辨率,满屏只能显示11行的汉字(10行用于显示正文,最底下的1行用于输入法的提示行),导致很多软件无法与英文的24行界面相兼容。为此,CCDOS又在软件中加入了滚屏的功能,勉强兼容了大多数的流行软件。

另外,一个一级汉字字库就要占用200多K的内存空间,对于只有640K物理空间的DOS而言也是一笔不小的开销,会严重压缩应用软件的可用内存,所以总体而言,CCDOS虽然实现了汉字的显示,但也带来了各方面的不尽人意,这时纯硬件的长城方案就显出了明显的优势。

长城方案从技术上讲就是通过特定的硬件设计,完全实现了以文本模式显示汉字,而不是CCDOS的图形模式。它跟英文字符的显示方式完全相同,在自家的汉卡上集成了字库及显示逻辑器件,只要往屏幕缓冲区写入一个汉字代码,屏幕上就会自动显示出对应的汉字。为了保证汉字与英文的一致性,它的屏幕也换成的高清的640×400分辨率。如此,大量的英文软件几乎不需要做很大的改动,就可以很好地兼容汉字显示。

当然,硬件的汉卡方案的代价也非常高:为了显示汉字,要往主机中插入一块物理的“汉卡”,其价格在当年也相当昂贵。

长城的硬件方案好像是独家的,因为门槛太高,挡住了同行的脚步,但CCDOS变成了软件方案的祖师爷,各种在它基础上修修补补的山寨版如雨后春笋相继问世。印象中,好像普遍都是以CCDOS的2.10或2.13版本为基础修改的。

当时市场上还没有现成的汇编语言编译器,或者因为CCDOS的发行版已经固化了内部函数的地址,山寨版只能以DOS自带的debug工具对CCDOS进行简单粗暴的修改,套路基本都是在某个不重要的地址范围内“挖”出一个窟窿,然后把自己的代码放到那里,再通过jmp汇编跳转指令把调用关系连接起来。

用debug工具打开各家山寨的CCDOS,可以很清楚地看到负责显示的int10中断处理函数被改得千疮百孔,东边一块西边一坨,一些处理方式显得十分笨拙,除了作者的水平所限,或许背后还有若干的无奈。这在软件工程高度专业化的今天是难以想像的,但那就是当年国内众多高手的实际水平。

等到PC电脑具备了汉字处理能力后,国内厂家又进入了输入法的比拼时代,一时间百花齐放,进而造成了“汉卡”概念的异化。

CCDOS实现了汉字的显示和录入,但它自带的输入法非常的原始,非常折磨用户。输入法有四种,分别是区位、首尾、拼音和快速。区位就是直接输入汉字编码的“区位码”,录入汉字要挨个查找汉字编码表,几乎无法实用;首尾码则是按照一定的规则取汉字笔画的首和尾,以对应的字母找出最终的汉字;拼音则是通过全拼字母来输入汉字。最后这个“快速码”则是集合了首尾和拼音两种编码,先输入一个汉字的两键首尾码、再输入两键拼音码,以此来选择汉字。

首尾和拼音都有大量的重码,快速码则大幅压缩了重码率,有一定的积极意义,但代价就是要同时记住两套完全不同的规则,实际操作的时候对大脑是非常残酷的负担。多年以后的今天,只记得汉字“的”对应的快速码是TDDE。

显然,CCDOS唯一能被用户普遍接受的编码其实只有拼音一种,但它的设计非常反人类。汉字有大量的重音字,但CCDOS只是简单粗暴地把按照拼音排序的一级字库放了进去,并没有按照使用频度进行优化,特别是字库是按照汉字的四声排序的,一声的在前、四声的在后,最终导致一些非常常用的汉字要多次在提示行翻页才能找到。有的用户甚至最后都形成了肌肉记忆,在输入四声“是”的时候,先打上shi三个字母,然后嘴里默念着123456789…拼命翻页,最后大约是在第10页的第四个位置终于找到!

因为CCDOS自带输入法的糟糕,给了其他厂家一展身手的机会,各种方案八仙过海各显神通,搞输入法编码的一度踏破了国家专利局的门槛,甚至最后逼得专利局直接停止了对编码方案的授权。

当时,后来粉墨登场的五笔输入法好像还没问世。因为DOS内存的限制,输入法除了编码方案不成熟,技术上也难以采用更复杂的算法来优化用户体验,于是大家普遍采取了“少花钱、多办事”的改良方案。其中最著名的大约是“联想式输入法”,其大致思路就是,当你输入一个“中”字的时候,软件会帮助“联想”出后边可能的“国”“华”“文”“间”等最可能的汉字,如果用户恰好要输入其中的某个字,就可以直接一键选中,速度也因此大大加快,这一简单粗暴的功能,对于很多需要大量输入官话、套话的用户而言,是非常有吸引力的。凭借这套联想式输入法,在当年举办的输入法比赛中,有人甚至创造了每分钟输入180字的惊人速度。

与此同时,PC电脑也从8088进入到了80286时代,速度大大加快;DOS也升级到了4.0以上版本(此处记忆可能不太准确),增加了“扩展内存”,屏幕也基本普及了高清显示,如此,制约软件汉字方案的各种因素基本消除:显示速度不再缓慢,字库可以放到扩展内存中、不再占用宝贵的常规内存,屏幕显示也做到了中英文完全相同,各种软汉字系统开始成为主流。

软件方案虽然保证了实用效果,但因为盗版的存在,无法保证厂家的经济利益,于是聪明的厂家又把本来的软件方案做了部分的“硬化”,推出了各种各样的“汉卡”。有的汉卡集成了显示字库,但最终显示仍然是软件实现的,硬件只是相当于一个储存文件;有的汉卡甚至连字库都没有,仅仅是一个标识版权的加密卡。这些后来的“汉卡”,与当初长城的汉卡只是名字相同,功能却完全不是一回事。

在那几年的汉卡大战中,各路人马各显神通,从技术、产品乃至销售领域全面发力,最终有一家自带“联想式输入法”的厂家大获全胜,公司的名字也改成了大名鼎鼎的联想电脑。自带WPS编辑软件的“金山汉卡”也取得了很好的市场业绩。

输入法比拼告一段落后,又开始了新一轮的打印效果的比拼。最早的汉字是16点阵的显示和打印,后来进化到了16点阵显示、24点阵打印,再后来就是更高的32、48点阵打印了。这一轮的明星是“巨人汉卡”,汉卡的内涵,从代表显示到代表输入法,再到代表打印效果,一路被重新定义。

因为软件方案的胜出,代价高昂的长城硬件方案逐渐淡出。纯软件方案也从最早的修修补补,进化到了各自写源代码从头开发,其中最具影响力的是UCDOS系统。这套系统推出的同时,PC进入到了windows 3.0时代,显示和打印都有了全新的技术路线,国内高手为了跟上节奏,又推出了相应的汉化补丁。早期的补丁是跟DOS时代同样套路的粗暴修改系统文件,后来有人找到了更精巧、安全的办法,通过修改windows核心函数的调用指向,让系统进入独立的汉字模块,并以此推出了风靡一时的“中文之星”,其创始人后来又推出了“四通利方”…..

一直到windows95发行之初,四通立方还在顽强地推出“更懂中文”的系统补丁,但慢慢发现实在无法做得更好,用户也不再接受这些东西,先后历经10多年的“汉卡”大战也终于成为历史。

全部专栏