最近总算是把老板布置的东东做完了。断断续续用了近3个星期,一直都想很快解决,好继续钻研ARM,结果欲速则不达,多花了些时间。大概是我考虑得太多,有的方面希望能够尽善尽美,结果却还是不令人满意。不过嵌入本来就是个成本敏感的东西,我觉得我这样子去考虑问题也没什么错。
好了,言归正传。
我曾经在网上看到过基于51的全拼输入法设计的一种方案,大概流程是这样:读入拼音字符串->查表取字->返回中文字符串地址。这应该是最简单的输入法模型了,不过这个方案我不是很喜欢,原因是它的表是建立在程序里的,并不是独立的。也就是说汉字和拼音都写到源代码里了,在我看来太过于死板了,第一次写程序岂不是要将汉字逐个输入?如果不是网上已经有源程序可以复制粘贴的话,打死我也绝不用这个办法。而且汉字表与拼音表之间有非常严格一一对应关系,倘若删了一个汉字而没有正确更改相应位置的拼音,则牵一发而动全身,所有的输出可能都是错的。另一个关键因素是,无独立字典且不能随意生成字典,对于字典的扩展或者精简是非常不利的因素。
所以我想做一个带分离字典,并提供字典生成功能的方案。
首要解决的问题是,如何能够最大程度地偷懒并且成功实现目标。我属于懒人,不愿意把大量时间花在打字员才该做的工作上,所以我利用了windows的全拼字典——winpy.txt,对这个有兴趣的到网上一搜便知。不过尽管想偷懒,有些繁琐的工作还是不得不做的,winpy.txt的文件头及词组是不需要的,还有其多音字提供了两组拼音,这是不需要的。请不必担心多音字的查找问题,winpy.txt多此一举地将多音字加了两组拼音,却又在其第二读音处提供了该汉字。比如:对于拼音表来说,在ai里面有“呆”字,而在dai里面同样有“呆”字;对于汉字表来说,“呆”自身同时也提供了ai和dai两组拼音,想办法去除一组即可。这些用手工去除也比较方便,因为都是按字母顺序来的,当然编程也可以。
这是第一步精简,第二步精简是将整个字典转换为非unicode,这样便于操作,也能减小字典占用空间。第三步精简是将txt文件转为unix格式,这样做的好处仍然是两个:减少空间,便于操作。由于windows下的txt格式其换行符是两个:'\r'和'\n',而unix下只有'\n',又减一半。更重要的是便于之后的判断取字。初始大概1M,最终应该能有162k。当然这样的精简还远远不够,我们之后还需要进行第四步的精简,在后文将会提到。(待续)