缘起

在windows下使用的sougou输入法,不仅常常弹出广告,没有哪些异常行为,Linux下的英文输入法虽然没这么强悍好用了。原本用的是Ibus中的pinyin,后来由于机缘巧合装了yong输入法,发觉很好用的,就仍然用着。慢慢的发觉yong输入法在一些自由软件中不起作用,有时还行为怪异,尽管大多数的时侯,工作的很正常。本着程序员好奇的态度,我想打开输入法这个黑匣子,瞧瞧上面有些哪些。

正文1.简介

输入法的工作原理是击键消息(window中消息)首先献给输入法管理器(后端),输入法管理器调用输入法的转换函数(输入法引擎),输入法的转换函数得到击键消息并保存在自己的字段中,当符合规定条件时(如五笔输入法输入:四键、两键+空格等),输入法把适当的字、词返回给输入法管理器,输入法管理器再把结果字、词传给关联的应用窗口。

简单的来说,输入法就是一个查表操作,输入的信息是鼠标信息,依照击键消息到表中查找对应的汉字。举个反例:将码表导出到Excel。假定码表是基于拼音的,码表分两列,一列是拼音,一列是汉字串,这么用键盘点击编辑->查找,在查找内容框中敲入shishi,点击查找下一个按键,白色圆形框立刻就跳到A列的shishi的行里面,对应的B列就是“试试、事事、实施、时世、史实……”等等这种汉字串,输入法的原理就是这样[2]。PS:计算机程序中都可以简化为查表程序,这个表可能是链表,字符串或则数据库。表驱动编程本质上就是从数据的角度出发,按照数据来编程(参考《代码大全第二版》)。

因为输入法编程中涉及消息处理机制,而消息处理机制是操作系统的核心机制,理解上去比较麻烦。并且,“学习输入法编程,要带着问题学,活学活用,学用结合,急用先学,立杆见影,在“用”字上狠下工夫。为了把输入法编程的真谛真正学到手,要反复学习输入法编程的结构和算法,有些概念、算法最好要背熟,反复学习,反复运用。”[2]PS:这段话可以简化为:世上无难事,只要肯攀越。

关于在windows下学习输入法编程的资料收集如下:

1.输入法工作原理:

2.输入法浅谈:(备注:原文发布在某峰会上,地址为:)

Linux下的输入法框架无非Scim/Ibus/Fcitx这三类。在网上搜了一通,仅发觉一篇关于Scim工作原理的论文,ibus和fcitx都是相应的google代码库,恐怕源码和文档都应当很全。个人觉得linux模拟,用scim的人不如ibus和fcitx多了,开发也不及后二者了。并且scim有如此一篇2页的论文,省去看ibus之类的文档和源码,但是既然同样都是输入法框架linux 输入法 scim,总会存在一些共性的特点,相差不到哪里去。

2.SCIM

基于XIM结构的输入法与XWindows系统结合过分紧密,未能支持国际化语言环境,SCIM就是针对这种问题的。SmartCommonInputMethod(SCIM),SCIM输入法构架的优越性:1.支持语言多2.面向对象设计3.高度模块化,功能模块,插件方式4编程插口简单5.独立于图形界面,以便开发和移植

2.1.SCIM的结构设计

SCIM包含的模块:

2.2.工作原理

在SCIM中,输入法有三大功能模块:后端(FrontEnd),引擎(IMEngine)和前端(BackEnd)。这三大模块分别实现的功能是:

FrontEnd:主要负责用户界面的显示,以及与顾客程序进行交互,将顾客程序的键盘恳求转发给IMEngine,执行IMEngine发出的各类命令,如勾画预编辑字符串等等。FrontEndBase泛型负责管理所有IMEngineInstance实例。

IMEngine:接收FrontEnd发送的键盘风波,之后向FrontEnd发送相应的命令,如显示预编辑字符串、向顾客程序递交字符串等等。

BackEnd:管理所有的IMEngine。如简拼、双拼、五笔、手写等。

在SCIM中最关键的部份是FrontEnd和IMEngine。这两部份的实现及其之间的通信形式(本地socket)是SCIM较其它输入法平台最不同的地方。

FrontEnd主要完成用户界面的勾画、与顾客应用程序交互,FrontEndBase泛型负责管理所有IMEngineInstance实例这三方面工作。每位IMEngineInstance实例用惟一的id进行标示,FrontEndBase类提供的函数和IMEngineInstance的id完成对IMEngineInstance的所有操作。FrontEnd派生类不需直接处理IMEngineInstance实例或则其表针。

IMEngine分为IMEngineFactory和IMengineInstance两个插口类。要实现具体的输入法,例如纵横汉字输入法,就必须提供这两个类的具体实现。IMengineFactory不仅负责管理如词库等的输入法涉及的公共数据,还负责创建IMEngineInstance实例。IMEngineInstance类则负责把实际的键盘转换为字符串。

FrontEnd和IMEngine之间的数据通讯采用了一种松散的插口方式,即signal-slot技术,这样的形式可以简化编程插口。输入法引擎所需的所有动作都经由signal-slot发送给FrontEnd,而输入法引擎须要处理的风波则直接由FrontEnd调用IMEngineInstance类的相应函数来传递。

2.3.吐槽

参考[4]的论文中存在一些文字错误,重复以及术语的前后不一致,显著有整合和堆砌的觉得,看了一下其参考文献,百度文库和一篇csdn的博客赫然在列,让我对该英文刊物的质量表示怀疑,去看了一下引用的源后,果然是整合的,前半截+图来自文库,后半截来自博客,对于这些拼接法搞学术,表示强烈的厌恶,尽管我也常常干这些事情,而且我copy&paste的技术绝对比她们好,觉得有点五十步笑百步。

强烈构建参考原出处,原出处的文章具有一致性和连贯性,不是拼接的,并且愈发图文并茂:

1.SCIM输入法构架剖析(上)

2.SCIM输入法构架剖析(下)

3.IBUS

IntelligentInputBUS(iBus)是一个输入法平台,可以理解为是一个早已写好的与系统交互的库,各类输入法运行在iBus上。iBus以前是Python写的,如今早已用C++重画,效率得到很大的提升,兼容性要远远强于Scim。iBus可以让程序员专心地编撰输入法功能的代码,而不是把过多的精力浪费在与系统交互上,进而提高输入法的可移植性。

Ibus的wiki上的介绍:(百度百科上的介绍过时太久了)

Ibus在Ubuntu系统上安装:

Ibus项目地址:

4.Fcitx

Fcitx的wiki介绍:

Fcitx还和搜狗合作开发Linux上的搜狗输入法,其在Ubuntu(LinuxMint)的安装参考

Fcitx的google项目地址:

Fcitx的GitHub地址:

Fcitx的安装:

5.Yong输入法

Yong输入法基于ibus的,而且又和Ibus上的输入法ibus-pinyin之类的不太一样。

输入法峰会及下载:

安装可参考:

具体的,我也不是特明白其实现机制,先留给伏笔,等之后我明白了再加。

仔细查看了yong提供的帮助和相关的文档,发觉在当前Home目录下的.yong中存在这样的一个文件pinyin.usr,打开后可以见到如下模式的文本:

{0}aihe爱喝

{-}anquanjiang安全将

{0}anshenye助眠液

{0}ansong暗送

{0}aojiao傲骄

{0}badi拔地

{0}baiban白板

{0}bailv百虑

{0}baishikuai百十块

{0}baiyou柏油

{1}baiyou柏由

{0}baiyulan白玉兰

在听到有一些自己常用的输入后,想到yong的帮助提及的造词和删词的功能(快捷键操作太难用),恐怕就是通过在文件中设置{}中的数字实现,{-}表示删掉,{0}或{1}行为不太明白,在文件中添加新词表示造词。更改该文件后,发觉并没有能严禁,将yong进程杀害,再重启就见效了,看来yong默认会将该文件加载到显存中去,回想前面介绍的输入法就是查表操作,这个pinyin.usr就是这样的表北京linux培训,不仅这个表以外,还有个pinyin的主表是安装目录yong/mb/下的pinyin.txt和pypre.bin,打开pinyin.txt后,其文件内容是:

key=abcdefghijklmnopqrstuvwxyz

len=63

wildcard=?

pinyin=1

split='

hint=0

user=pinyin.usr

assist=mb/yong.txt2

code_a1=p..

[DATA]

在[DATA]目录下的字母对应的字符为不可辨识,恐怕是对怕pypre.bin中的二补码的数据的索引,但又认为不太像。

按照帮助文档的,将一些不须要的文件删掉了,只剩下3M了,同样也能工作,觉得十分好。安装目录yong保留的文件如下:

yong目录下的:libl.so(基础库),libmb.so(码表库),yong(主程序),yong.conf(配置文件),yong.ini,yong-tool.sh(安装卸载脚本),yong.chm(帮助文档),keyboard.ini(软件盘配置文件),normal.txt

skin目录全部保留

mb目录只保留我须要的拼音输入法(pinyin.ini,pinyin.txt,pypre.bin)和english.txt

gtk-im目录下的动态联接库也须要保留,不然连输入框都不显示。

yong-config二补码程序也要保留,这个图形配置界面的程序。

备注:看见yong官方将输入法更新到了2.1,不清楚作者如何设置版本号的,试用了一段时间,发觉很不稳定,经常打字不上屏,害我要将进程杀害再重启,相当麻烦,我又退回1.7,用了好久,十分稳定。

杂记

原本想好好的了解一下输入法,以及我使用的Yong输入法的,结果只是在收集资料,了解一些很宽范的东西。在收集资料的时侯,看见一个关于学习技巧的观点:重基础胜过方法,看书胜过看刊物,看代码胜过看文章,和同学讨论胜过上峰会,写BLOG胜过看BLOGlinux 输入法 scim,以及学习方式无优劣之分,只有合适不合适之分,所谓天下殊途同归,一致百虑。

二手文献和原始文献之间,存在一条加工的沟,但是并不是所有的二手文献都比原始文献好。

LinuxMint的界面蛮好看的,有机会尝试一下。

参考文献

[1]SCIM输入法构架剖析:

[2]输入法浅谈:

[3]关于Ibus拼音的开发:

[4]SCIM输入法构架及其工作原理,王丽君,李培峰,ChinaAcademicJournalElectronicPublishingHouse

[5]我的学习方式:

本文原创地址:https://www.linuxprobe.com/lxdzwsrfkklm.html编辑:刘遄,审核员:暂无