关于输入法的资料真是少的可怜,除了微软的MSDN和DDK,几乎没有什么可以看的资料了。好在还有那些无私奉献的大师们开放了他们的代码,这对一个研究输入法的人来说是极其宝贵的资源。绝大多数开发输入法的人都参考了自由拼音(freepy),本人也不例外,在此对开放源代码的李振春老师表示感谢,极大的推动了国内输入法的改进!
由于本人原来对VC++接触较少,真正的研究还是从研读freepy时开始的,所以读这个程序还是有点吃力。但是工夫不负有心人,经过几个星期以来断断续续的研读,其中大部分内容都基本了解。
我开始的时候找不到资料,同时又看到很多人在做输入法,感叹为什么没有人系统的介绍一下输入法的设计原理。难道真的是不值得介绍吗?真的是很简单吗?到现在看来,虽然不是完全,但确实是有点。
在读的过程中有一个问题困扰我多日,今天终于搞懂了,发帖庆祝,同时也希望对有共同爱好并且遇到相同困难的哥们有所帮助。
typedef struct _KEYPH {
SHORT wLen;
SHORT wLen;
BYTE abKey[MAX_PHRASE_LEN+1];
HZPH __based(lpMapFileBase) *lpHZPH;
struct _KEYPH __based(lpMapFileBase) *lpNext;
HZPH __based(lpMapFileBase) *lpHZPH;
struct _KEYPH __based(lpMapFileBase) *lpNext;
} KEYPH, FAR *LPKEYPH;
(1)wLen是词组的长度。
(2)abKey[MAX_PHRASE_LEN+1]是用来记录词组中各个汉字的拼音的key的。[key是拼音在LPPINYIN中的定位,即拼音所处的序列号,如:a 为1 an 为2等]
因为key的值会超过255的。所以一个字节不够保存了,需要9位二进制来记录。那么abkey[i]记录了第i个汉字对应拼音的后8位的值,abkey[0]中的8位分别对应着abkey[i](1<=i<=8)最高位,加上abkey[i]共9位二进制来记录了第i个汉字对应拼音的key。
(3)lpHZPH是记录着一个词组链表,该链表中包含了对应该拼音编码的所有词组。
(4)lpKEYPH指向下一个KEYPH,组成一个链表。
以上是本人对KEYPH的理解,希望大家指正!
原文见http://danglx.blog.163.com/blog/static/3996118220051036044685/