基于中文Windows平台的纵横码
输入系统的实现技术
苏州大学纵横汉字信息技术研究所吕强 王红玲 张玉华
一、引言
基于Windows平台的纵横码输入系统,是一个专为Windows中文环境提供纵横码汉字输入的系统。该系统全部使用Windows提供的标准API调用,在应用程序这一层次上实现了输入功能,因此其代码无须任何修改便可以运行于所有的Windows中文平台(包括中文Windows 3.1,中文Windows3.2,中文Windows95,中西方Windows与Cstar或RichWin等的组合)。系统提供了单字、词组联想和自定义输入功能;同时,系统还提供了一些配套程序,用于维护自定义码表等。系统具有安装简单、操作方便、灵活等特点,与通过使用Windows提供的输入法生成器生成的输入法相比较,具有码表结构更灵活,词条数目更大,系统功能更全面等优点。
二、系统结构
ZH1、ZH2、ZH3、ZH4、ZH5、LX2、LX3、LX4、LX5是纵横码输入系统所用的码表,其中ZH1~ZH5分别表示单字,二字词,三字词,四字词及多字词码表,它们的结构如下:码表以项为单位,一项表示纵横码和它对应的字或词条。每一项中纵横码占3个字节,不足3位以0xFF补足。纵横码以BCD码形式存放,接着存放汉字内码。对于ZH1~ZH4,汉字存放没有结束符,而ZH5即多字词码表(五字词以上)由于不能确定词组的长度,因此表项为不等长,每一项以“0xFF”为结束符。LX2、LX3、LX4、LX5是系统联想码表,其数据结构如图1所示。(图2所示为ZH5结构)
| 经 | 济 | 一 | 体 | 化 | 0XFF |
图1 联想码表数据结构
| 21 | 31 | 00 | 经 | 济 | 一 | 体 | 化 | 0XFF |
图2 码表数据结构
另外,系统中还使用了两个码表:zdyz和zdyc。这两个文件是由系统生成,由用户添加内容,是专用于存放自定义字词的文件。“zdyz”存放字,结构与“zh1”相同;“zdyc”存放词组,结构同“zh5”相同,每项以“0xFF”结束。
三、查表算法
系统收到输入码结束后,即开始查表。如果结束键是“/”或空格,对“zdyz”和“zh1” 进行操作;如果结束是“*”键,则对“zhyc”、“zh2”、“zh3”、“zh4 ”、“zh5”进行操作。算法如下:首先将输入码缓冲区(InputCodeBuf)中 的纵横输入码由ASCII码转化成压缩的BCD码,放入code数据组中。顺序打开文件,将文件指 针IpbMb[i]指向文件头,指针所指的连续的三个字节送入code1数组中,将code与code1的 内容作比较。如果相同,将文件对应的那一项汉字内码送入输出缓冲区(OutputBuf)中。如为汉字,则三个字节的纵横码接下的二个字节既为所需汉字;如为词组,又分为两种情况: 五字词以下,则按一个汉字占两个字节来看,有几个汉字就是它的两倍字节,项与项中间没有分隔符;五字词及五字词以上,项与项之间用0xFF分隔。不管两个数组中的内容是否匹配 ,文件指针都必须向后移过一项。查找匹配过程一直进行到所有文件都查找完毕。最后,所有与输入码相符的汉字或词组均放在OutputBuf中,由显示输出模块显示。
四、键盘截取
1Windows消息机制
Windows通过发送消息与程序通信。所有 的Windows程序都在Windows()函数中建立消息循环。该循环从应用程序的消息队列中读取尚未处理的消息,并再将该消息分配回Windows,由Windows以该消息作为参数调用应用程序的窗口函数。可通过调用函数GetMessage()读取消息。在消息循环内,共调用了2个函数。第一个是API函数TranslateMessage()。该函数负责将Windows生成的虚键盘代码转换成字符消息。读取和翻译完消息后,还应将其送至Windows,具体可通过API函数DispathchMessage实现。Windows会一直保存该消息,直到它被传递给应用程序的窗口函数。消息循环一旦中止,Windows()函数也随这结束,将程序中止时所产生的返回码返回给Windows。
该系统Windows消息循环主要处理了WM_CHAR,WM_LX,WM_SEPERATOR,WM_DINGYI等消息,其中WM_LX,WM_SEPERATOR,WM_DINGYI消息是本系统自定义的消息。
2控键转义实现
该系统设置了一些快捷键来实现某种功能,如联想功能,标点功能,自定义功能等。系统使用的动态链接库为“hook.dll”。这一模块的功能是截取键盘上的输入键,将输入键进行过滤,滤掉系统不使用的键,保留系统所用键。再对特殊键进行特殊操作,如Ctrl+1(小键盘)作为联想功能的快捷键,它所发的按键消息为自定义的WM_LX”消息;Ctrl+2(小键盘)为自定义单字、词组的快捷键,发送“WM_DINGYI”消息;Ctrl+3(小键盘)为标点输入的快捷键,发送“WM_SEPERATOR”消息。对于非特殊按键,则一律将之转换成对应的字符,向主程序发出“WM_CHAR”消息。由主程序对各类消息进行处理。对于其他按键,由操作系统按原按键消息进行处理。
该系统另一特点是,完全使用小键盘进行输入。 由于在Windows中对按键以虚键码来处理。对于小键盘上的键,当NumLock键打开时的虚键码同关闭时的虚键码是不同的。要在忽略NumLock键的情况下唯一确定小键盘上的键,只能使用这些键的扫描码,因此在动态链接库中,对小键盘上的键做了特殊处理,取得键的扫描码将之转化为对应的ASCII码,并向应用程度窗口发送WM_CHAR消息,由主程序处理。
五、结束语
该输入系统的框架结构、功能已基本完成,但在界面设置方面有待完善。限于编程语言的限制,以后的发展趋势应是现可视化、图形化方向发展, 应从16位编程向32位编程发展。