从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 条评论
强人一个啊,这么容易就移植到linux下面去了。linux公社很久以前有朋友做了linux下的天然码码表,实现了linux下的天然码输入。我这里都还有这个文件的备份呢,呵呵
可以共享吗,有了天然码linux版,我基本不用windows了,谢谢.zheng.chunhan@yahoo.com
是啊,可以共享吗?我是菜鸟,可以传一份吗?lmxiaosong@126.com,谢谢。
高人啊高人!佩服!
真的很高明,能给我一份吗?ntchenmail@163.com
你能制作windows7下的三维天然码吗?感激不尽哦。
抱歉,我不用Windows 7,也不了解Windows 7的输入法体系。