Linux的SCIM版天然码输入法的制作

从2002年开始一直在用天然码输入法,后来07年换了电脑,就没再用了。最近打双拼烦了,又想起来自己还用过天然码这样一个输入法。于是上天然码的网站找下载,发现根本没有更新。论坛里除了营销人员的置顶帖,只有一片骂声,主要是骂它不支持Windows7。

连Windows7都不支持,看来更无望在Linux上用了。于是上Google搜了一下相关的文章,huzi一篇《自制天然码输入法》的文章引起了我的注意。这位老兄用天然码的字典和拼音的词库制成了天然码的码表,然后用输入法生成器生成了自己的Windows天然码输入法。有了码表,那么制作Linux输入法也就可能了。马上动手!

先去天然码的网站下载字典,发现已经不提供下载了。突然想起天然码首页有个查字功能,可以自己写一个程序遍历一下GBK字库反查出编码来。随便查了个字,网站报Microsoft JET Database Engine错误,(*@#&@,晕死。

没有字表,词表也不能生成,失败!

于是另想办法,先下载安装天然码的天码行空版,然后用UE以16进制打开C:\Windows\system32\trm32.mb,发现码表文件中词对应关系是GBK编码明文。只是在mb文件中还有很多的00、ff等字符,必需去掉才能成为纯文本。这个简单得很,马上写一个C程序

#include "stdio.h"
int main(int argc, char **argv) {
    char c;
    char cn;
    while(1) {
        c = getchar();
        if(c == EOF) {
            cn = getchar();
            if(cn != EOF)
                c = cn;
            else
                break;
        }
        if(c == 0x00) c = 0x0a;
        putchar(c);
    }
    return 0;
}

保存为conv.c,编译,运行,把trm32.mb的所有00替成换行符,所有FF去掉。

cc -o convert conv.c ./convert < trm32 > trm32.txt

然后用文本编辑器打开trm32.txt,去掉开头的输入法描述部分。再观察码表正文,居然是前置编码,还省略了首字母。于是用正则替换整理,让字和码同行。正则查找([0-9a-z]*)\n替换成\n\1。再去掉连续的空格[ ]{2, 100}替换成空字串。

接下来就是补齐首字母。观察码表,发现每个单键码字首部都有一个空格,于是再写一个C程序来补首字。

#include"stdio.h"
int main() {
    char s[50] = "";
    char *t = "123456789abcdefghijklmnopqrstuvwxyz";
    int i = 0;
    while(gets(s)) {
        if(s[0] == ' ')    i++;
        printf("%c%s\n", t[i], s);
    }
}

编译运行于是得到天然码的完整码表。再另存为成UTF-8编码,然后用scim-make-table把五笔的scim-table首部描述抄过来。用uuidgen自己生成一个uuid,把该改的全改了。然后用scim-make-table作成trm.bin,拷到scim的tables目录。重启,成功。

Update 6/20/2013: 想要码表的朋友可以访问我的GitHub项目,三维天然码的编码方案受中国专利保护(专利号CN95100877.3),码表仅供个人研究和使用,不可用于商业用途。

也許你還會喜歡

7 条评论

  1. 强人一个啊,这么容易就移植到linux下面去了。linux公社很久以前有朋友做了linux下的天然码码表,实现了linux下的天然码输入。我这里都还有这个文件的备份呢,呵呵

  2. 可以共享吗,有了天然码linux版,我基本不用windows了,谢谢.zheng.chunhan@yahoo.com

  3. 是啊,可以共享吗?我是菜鸟,可以传一份吗?lmxiaosong@126.com,谢谢。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Time limit is exhausted. Please reload CAPTCHA.