|
这几天一直在研究如何把中文输入法一直移植到其他平台(osx),这里讨论的东西和平台其实无关,都是我在读代码时的一些思考。
这个论坛上讨论最多的输入法是 james 的 scim 以及 yuking 的 fcitx。
scim 无法在osx上编译过去,主要原因是osx对于基于STL的动态库支持不好,编译过去后,无法启动,很多"dyld: scim undefined symbols"。如果采用静态编译,scim 可以启动,但是所有的module都无法载入。我想这可以在程序设计中解决。如果可以判断一下需要的模块是 load 或 link , 那么在进行跨平台移植就好半了。
fcitx 的移植后跑的不错,不过有个很奇怪的问题,就是选中的字无法上屏。研究了代码以后,有些东西无法理解,希望高人指教。
fcitx 通过 SendHZtoClient 把本地编码的字符送到 X 的应用程序。我在zh_CN.UTF-8的环境下DEBUG, 选用汉字:你”为例子。
Unicode 码表: 4F 60
UTF-8 编码: e4 bd a0, 这就是把 4F 60 转化为UTF8 的结果。
SendHZtoClient 实际送出的是 UTF-8 编码 (e4 bd a0), 但是在应用程序端受到的是 (c3a4 c2bd c2a0)。这是把 (e4 bd a0) 再次编码的结果,于是显示就出问题了。
我察看XFree86的源码,XIM的输入都是通过 XmbLookupString 拿的,而这个函数会把所有的输入都当地locale编码,然后返回给X应用程序。而且XmbLookupString 是把每个字节进行转换,所以当我从fcitx中送如 (4f 60), xterm 没有得到 (e4 bd a0), 而是否(4f 60), 因为XmbLookupString 把 4f 60 看做了2个字符,而不是一个汉字。
我觉得这个问题和XFree86UTF8实现有关,我用的是4.3.99,应该对UTF8支持的很好拉呀?。。。。。。
迷惑中。。。。 |
|