LinuxSir.cn,穿越时空的Linuxsir!

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

两个关于fcitx的utf8支持的问题及修正

[复制链接]
发表于 2004-4-23 19:24:47 | 显示全部楼层 |阅读模式
这两天在作一个需要utf8的项目,因此调出了fcitx的utf8支持,
发现了两个问题并作了修正。如果我搞错了还请勿见笑:)

fc的u支持与bIsUtf8这个变量相关,查看源码很容易发现,
调出u支持只有两种方法,一种是在配置文件中设定 区域设置=zh_CN.UTF-8;
否则就是通过$LC_CTYPE=zh_CN.UTF-8 fcitx这种方式启动fcitx。
其中前者的优先级高于后者。ufcitx启动后,就只能在Locale为u的窗口中输入中文了,
Locale为gbk,gb2312等的窗口按下Ctrl+Space调不出ufcitx来。所以第一个问题是,
我用$LC_ALL=zh_CN.gbk LANG=zh_CN.gbk rxvt命令打开一个终端上bbs的话,
就只能看而不能发表文章了。但是scim却能够同时在不同Locale的窗口中输入,
经查看scim的源代码发现,问题在于scim调用IMOpenIM 函数的时候,
IMLocale后跟的参数实际上是:“zh_CN.UTF-8,zh_CN.GB18030,zh_CN.GBK,
zh_CN.GB2312,zh_CN,zh_TW.UTF-8,zh_TW.Big5,zh_TW,zh_HK.UTF
-8,zh_HK.Big5-HKSCS,zh_HK,ja_JP.eucJP,ja_JP.ujis,ja_JP,ko_KR.eucKR,
ko_KR,ja_JP.UTF-8,ru_RU.UTF-8,ru_RU.KOI8-R,ru_RU,ko_KR.utf8,ko_KR.UTF-8,
en_US.UTF-8”(suzhe太厉害了: )。

而fcitx里相应的调用方式是 IMOpenIM (dpy, IMModifiers, "Xi18n", IMServerWindow,
im_window, IMServerName, imname,
IMLocale, (strcasecmp (strDefaultLocale, "zh_CN.gb2312")) ?
strDefaultLocale : "zh_CN",
IMServerTransport, transport,
IMInputStyles, input_styles, NULL);
可见每个fcitx进程只能支持一种locale,要不就是strDefaultLocale,
要不就是zh_CN(??我猜的)。

因此对它进行了修改,改成   
                    ims = IMOpenIM (dpy,
                    IMModifiers, "Xi18n",
                    IMServerWindow, im_window,
                    IMServerName, imname,
                    IMLocale,
                    "zh_CN.UTF-8,zh_CN.GB18030,zh_CN.GBK,zh_CN.GB2312,zh_CN",
                    IMServerTransport, transport,
                    IMInputStyles, input_styles, NULL);

呵呵,编译安装后还是有问题,因为这时候不能再用UTF8的方式启动fcitx了,
因此在config文件中用#注释掉 “区域设置=zh_CN.UTF-8”,同时以
$LC_CTYPE=zh_CN.gbk fcitx&启动fcitx,搞定!测试一下,
用LC_ALL=zh_CN.utf8 LANG=zh_CN.utf8 LC_CTYPE=zh_CN.utf8 emacs
和 LC_ALL=zh_CN.gbk LANG=zh_CN.gbk LC_CTYPE=zh_CN.gbk emacs
分别启动两个编辑器,都能输入中文了:)

这才一个问题呀,第二个问题呢?55,我都要哭了。一开始我还写了一大段代码,
把每个调用中文输入的窗口的locale都记下来,然后在SendHZtoClient函数中根据
每个窗口各自的locale调用iconv的,因为suzhe在scim里就是这样实现的。
写完了我才发现,根本用不着这些东西。除了上面的那个修改别的什么都不用了,
反而可以把YuKing原来的那些UTF支持的代码通通删掉了,那些iconv语句好象也
全都用不着了!(这个肯定与XmbTextListToTextProperty函数有关)

我用的是fedora,/usr/lib/locales目录下只有zh_CN.utf8,没有zh_CN.UTF-8,
于是参照网上的方法自己生成了一个zh_CN.UTF-8的Locale。

ps1,2.x的fcitx智能性很不错,其代码清晰,所以我放弃了scim,重投fcitx的怀抱了:)
ps2,在linux底下编程是不是只要malloc,不用free也没有大关系呀?系统最后会自动
回收的?我看fc里有几个地方都只malloc,不free的说(比如InitXIM函数里面)。
发表于 2004-4-26 14:19:10 | 显示全部楼层

谢谢

这个问题正在修正中……
按理说是应该调用free的,只是XIM一旦运行起来,正常来说是不应该被终止的,因此没有写那部分代码,这样倒使得程序变得轻巧了一点点。当然,即便不调用free,系统也会自己回收相应的内存的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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