QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2996|回复: 11

FCITX輸入中文繁體字的補丁

[复制链接]
发表于 2006-6-24 01:37:34 | 显示全部楼层 |阅读模式
眾所周知,GBK碼中收錄了很多中文繁體字和簡體字,而GB2312幾本
只收錄中文簡體字。而我們所喜愛的FCITX輸入法中有對GBK簡繁轉換
進行支持,于是,拼音輸入只能輸入簡體詞組,而繁體詞組則相當麻
煩幾于這個原因,本作者對FCITX,做了極為DIRTY的HACK(部分原因
是因為FCITX中的代碼極其煩冗,不易擴充,當然FCITX的作者們所做
的工作是有目共睹的),下面的PATCH中,對FCITX的幾個檔案做了挂
接處理,做了自動轉換簡體到繁體的功能。

補丁包說明:
gbks2t.tab  - 本人整理的簡到繁字體轉換碼表
fcitx-3.2-output-gbk-tradition.patch - 補丁文件

安裝說明:
拷貝gbks2t.tab到 fcitx源碼 data/目錄下
進入fcitx源碼目錄
patch -p1 < fcitx-3.2-output-gbk-tradition.patch

編譯說明:
aclocal     
autoconf
automake
libtoolize --copy --force
make
make install

其他說明:
本補丁針對 FCITX 3.2代碼
代碼中還修改了一下“联”這個字的圖標,以使這個圖標和我新增的
“繁”這個字的圖標一致,很不恭敬的作法希望原作者原諒。

關于GBK編碼下無法輸入某些字符的原因已找到,是因為libX11庫中GBK
編碼轉到UNICODE編碼時出了問題。補丁包裏有一個處理這個問題的補丁,
針對libX11-1.0.1(xorg7中模塊),libX11-1.0.1-gb18030.patch
這個是以前用來處理gb18030時用的,我做了一下處理同時處理GBK編碼,
這樣處理以後在X中看來GB18030和GBK編碼是同樣的東東了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2006-6-24 01:41:16 | 显示全部楼层
顶一个先
回复

使用道具 举报

 楼主| 发表于 2006-6-24 01:41:36 | 显示全部楼层
另外要感謝KanKer,關于無法輸出某些繁體字符問題上的幫忙和提示,

THANK V'MUCH
回复

使用道具 举报

发表于 2006-6-24 11:10:27 | 显示全部楼层
非常感谢,如果你能参加进来,负责 magic 的繁体(正体)中文化,以及改进 magic,请和我联系,我们一直没有这方面的高手。可以用站内信件。也可以上 msn:jackliu9999 [AT] msn.com
回复

使用道具 举报

发表于 2006-6-24 12:47:00 | 显示全部楼层
用起來很爽,感謝 wall_join。打過該補丁的 fcitx 3.2.1 下載地址:
http://www.magiclinux.org/dev/2.0-update/RPMS/fcitx-3.2.1-3mgc.i686.rpm
回复

使用道具 举报

发表于 2006-6-24 15:30:41 | 显示全部楼层
[quote:ace32041a7="KanKer"]用起來很爽,感謝 wall_join。打過該補丁的 fcitx 3.2.1 下載地址:
http://www.magiclinux.org/dev/2.0-update/RPMS/fcitx-3.2.1-2mgc.i686.rpm[/quote]
你。。。
居然打包好了也不告诉我,害我重新下载了3.2.1。。。
回复

使用道具 举报

发表于 2006-6-24 18:24:59 | 显示全部楼层
wall_join 的 fcitx 補丁中有一個小 bug,點擊gbk,聯、繁等按鈕時會引起輸入法切換,在此修正:
[code:1]
--- fcitx-3.2/src/ui.c.orig        2006-06-22 16:15:16.000000000 +0800
+++ fcitx-3.2/src/ui.c        2006-06-22 16:21:53.000000000 +0800
@@ -419,11 +419,14 @@
                        ChangePunc ();
                    else if (IsInBox (event->xbutton.x, event->xbutton.y, 38, 1, 55, 19))
                        ChangeCorner ();
-                    else if (IsInBox (event->xbutton.x, event->xbutton.y, 56, 1, 73, 19))
+                    else if (IsInBox (event->xbutton.x, event->xbutton.y, 55, 1, 72, 19))
                        ChangeGBK ();
-                    else if (IsInBox (event->xbutton.x, event->xbutton.y, 74, 1, 91, 19))
+                    else if (IsInBox (event->xbutton.x, event->xbutton.y, 72, 1, 89, 19))
                        ChangeLegend ();
-                    iPos = 92;
+                    else if (IsInBox (event->xbutton.x, event->xbutton.y, 89, 1, 106, 19))
+                        ChangeGBKT ();
+
+                    iPos = 107;
                }
                if (IsInBox (event->xbutton.x, event->xbutton.y, iPos, 1, iPos + 10, 19))
                    ChangeLock ();
[/code:1]

ML 的 rpm  包已修正,為3mgc。
回复

使用道具 举报

 楼主| 发表于 2006-6-24 20:52:08 | 显示全部楼层

關于Fcitx-3.2.1

我也發現這個問題了,fcitx-3.2下沒有這個問題,但fcitx-3.2.1
出現了,而且我到現在也沒搞清楚是為什麽,奇奇怪怪的,不過KanKer
的方法能管用。

如果是編譯fcitx-3.2.1的話,除了打我上面包中的:
patch -p1 < fcitx-3.2-output-gbk-tradition.patch

還要打下面的補丁:
patch -p1 < fcitx-3.2.1-output-gbk-tradition-extra.patch
見附件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2006-6-26 11:15:46 | 显示全部楼层
上面錯誤的真正原因,已找到,因為一個變量越界造成的。

先看代碼 fcitx/src/ui.c:
    INT8            iPos; /* -127到128 */

    iPos = 110;
-               else if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 11, 1, iPos + 30, 19))
-                   SwitchVK ();
-               else if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 31, 1, MAINWND_WIDTH, 19))
-                   SwitchIM (-1);
+               else {
+                   if (bShowVK || !bCompactMainWindow) {
+                       if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 11, 1, iPos + 30, 19))
+                           SwitchVK ();
+                       iPos += 20;
+                   }
+                   if (IsInBox (event->xbutton.x, event->xbutton.y, iPos + 11, 1, MAINWND_WIDTH, 19))
+                       SwitchIM (-1);

Bool IsInBox (int x0, int y0, int x1, int y1, int x2, int y2)

在FCITX3.2中因為是這樣調用iPos + 31,所以在調函數時,自動擴展成int,
所以不會出現越界。
而FCITX3.2.1中因為是這樣調用iPos += 20,所以此時iPos已經越界而變成
負數值,所以會在輸入法切換的box裏面。這樣在FCITX3.2.1中就出現了上面
的問題。我們只要將INT8 iPos改成INT32 iPos(或INT16 iPos)就解決了上
面的問題。

補丁如下:
--- fcitx-3.2.1/src/ui.c.orig   2006-06-24 19:09:53.000000000 +0800
+++ fcitx-3.2.1/src/ui.c        2006-06-26 10:47:55.000000000 +0800
@@ -336,7 +336,7 @@ void Draw3DEffect (Window window, int x,
  */
void MyXEventHandler (XEvent * event)
{
-    INT8            iPos;
+    INT32            iPos;

     switch (event->type) {
        //added by yunfan
回复

使用道具 举报

发表于 2006-6-26 12:45:54 | 显示全部楼层
知其然亦知其所以然,向 wall_join 同志學習  
回复

使用道具 举报

发表于 2006-6-26 14:13:58 | 显示全部楼层
牛人们。。能不能再做一个输出成big5编码的补丁?类似极点五笔中那样的功能?
回复

使用道具 举报

发表于 2006-6-26 22:41:30 | 显示全部楼层
谢谢~~
我已经将它加入了 :D
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-23 17:26 , Processed in 0.063169 second(s), 17 queries .

© 2021 Powered by Discuz! X3.5.

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