LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 960|回复: 9

关于fcitx和scim的研究,请指教

[复制链接]
发表于 2004-1-16 18:21:25 | 显示全部楼层 |阅读模式
这几天一直在研究如何把中文输入法一直移植到其他平台(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支持的很好拉呀?。。。。。。

迷惑中。。。。
发表于 2004-1-17 08:26:55 | 显示全部楼层
这个问题暂时不清楚,我的系统没有编译UTF-8支持。但论坛有人说可心在UTF-8上运行。
发表于 2004-1-17 09:53:59 | 显示全部楼层

您还试过什么输入法?

如题。
 楼主| 发表于 2004-1-17 10:49:33 | 显示全部楼层

fcitx 在 osx 上问题彻底解决

问题解决了。根本在于 libX11 在 osx 上缺省编译了-DX_LOCALE 。这样的话,libc 会自动把 set_locale 函数连接到 __XsetLocale 从而用X11的库来进行转化。X_LOCALE 一般是用在 libc 对于locale支持不好的系统中。

linux 中的X11 缺省是没有 -DX_LOCALE 的,所以个位大虾没有遇到了。

现在fcitx完美运行与 osx 中。谢谢yuking的辛苦工作。

(偷偷说一句,还是C的程序好移植。  ):thank
发表于 2004-1-17 14:21:42 | 显示全部楼层
好呀,有空我可以把 puzzlebird 同志的 mac 编译支持纳入到 autoconf 的 fcitx 中,这样大家以后编译起来就方便了。不过今天要回家了,可能在年后我想得向 puzzlebird 请教一下 mac 编译的具体实现。
 楼主| 发表于 2004-1-17 22:27:18 | 显示全部楼层
你的autoconf包做的很好。不过有几个地方可以改进。

fcitx 的系统数据文件是写在代码中的(/usr/share/fcitx),这样如果用autoconf 的 --prefix 进行编译会无法启动。

fcitx 的主程序中有些编译的"warning", 在他自己带的makefile情况下可以编译,但是用你的autoconf 编译不过去,必须改动。主要是 iconv 函数的定义上。

对于mac上的编译,要打几个补丁,再看如何做.?
发表于 2004-1-18 22:55:49 | 显示全部楼层
看到了,是在 ime.h 中:
ime.h:11:#define DATA_DIR                "/usr/share/fcitx/"
这是个不大不小的问题,得想想怎么解决了。

编译中警告过不去的问题是我加了 -Werror,我就是想把所有代码里不合适的地方找出来,都改掉。iconv 的警告我没见过,等回去了好好研究一下。

希望能做到把 mac 上不同的代码单独分离出来,这样就好把不同操作系统上的代码融合起来了。

现在家里,上网查资料和试验都不太方便,过几天再说吧。
发表于 2004-1-19 08:48:59 | 显示全部楼层
可以试试将prefix的值作为一个宏以-D的方式传递给编译器。但我不知道如何实现
 楼主| 发表于 2004-1-19 09:56:07 | 显示全部楼层
iconv 我怀疑是mac上的定义和linux上有些不同.

这是 mac 上的定义.

       #include <iconv.h>

       size_t iconv (iconv_t cd,
                     const char* * inbuf, size_t * inbytesleft,
                     char* * outbuf, size_t * outbytesleft);

fcitx 的主程序中,有几个地方没有定义 (const char** inbuf), 而是用的 (char ** inbuf), 该有 (size_t *) 的地方有几个忽略了.

不过都是小问题了.
发表于 2004-1-19 10:04:12 | 显示全部楼层
最初由 puzzlebird 发表
iconv 我怀疑是mac上的定义和linux上有些不同.

这是 mac 上的定义.

       #include <iconv.h>

       size_t iconv (iconv_t cd,
                     const char* * inbuf, size_t * inbytesleft,
                     char* * outbuf, size_t * outbytesleft);

fcitx 的主程序中,有几个地方没有定义 (const char** inbuf), 而是用的 (char ** inbuf), 该有 (size_t *) 的地方有几个忽略了.

不过都是小问题了.


这是 freebsd 和 linux 的差别。可以用 autoconf 检测出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表