论文部分内容阅读
摘 要: 基于XIM结构的输入法与X Windows系统结合过于紧密,不适合于Linux系统。而且XIM存在严重的设计缺陷,它无法支持国际化语言环境。而新一代输入法框架SCIM的出现解决以上问题,介绍SCIM的设计结构和工作原理。
关键词: SCIM;Linux;输入法
中图分类号:TP391.14 文献标识码:A 文章编号:1671-7597(2011)0820085-01
0 引言
国内最流行的Linux中文输入法是由余明俭等人开发的ZWinPro/Chinput。但由于该输入法直接依赖XIM输入法协议,而且没有考虑到对多语言环境的支持问题,因此这个输入法从架构上只支持中文输入。为了解决以上问题,苏哲等人开发了一个新的输入法框架SCIM(Smart Common Input Method)。作为新一代输入法框架,其架构设计精良,具有很好的扩充性和灵性性,代码质量也非常高。
1 SCIM输入法架构的优越性
目前,国际上有很多开发团队都在致力于开发基于SCIM框架的输入法,原因在于相对于其他的输入法架构,SCIM架构具有其独特的优越性。主要体现在:
1)支持40多种语言,包括中日韩语、东南亚各国语言、中亚各国语言以及各种拉丁语言。
2)采用完全面向对象的设计,并用C++实现。
3)高度模块化。每个功能模块都以独立插件的形式存在,非常的灵活。
4)简单的编程接口。
5)不但支持传统的键盘输入法,也支持手写识别等新式输入法。
6)输入法模块完全独立于图形界面,便于开发和跨平台移植。
2 SCIM的结构设计
有了SCIM输入法框架,输入法开发者只要编写简单的代码就可以实现自己的输入法,大大简化了输入法的开发难度。SCIM是完全模块化的,每个模块都可以完成某个功能,彼此之间非常独立,但是模块本身却是高内聚的。SCIM主要有以下几大模块:配置模块(Config)、引擎模块(IMEngine)、前端模块(FrontEnd)、进程间通信模块(IPC)、输入法Panel和Helper模块。下面简要介绍一下各个模块的特点和功能:
1)配置模块(Config)
配置模块最主要的功能就是为应用程序配置一些共享信息,以防冲突。所有的配置信息都由Config统一进行管理,其他模块存取配置信息都需要通过向它发送请求。SCIM的配置文件由Config 文件和Global文件组成,前者保存的是与输入法相关的配置信息,如输入法引擎、快捷键等参数,后者保存的是与输入法无关的配置信息,如socket超时、socket地址等信息。SCIM中的配置模块有不同的实现,但这些实现都必须遵循ConfigBase接口规范。
2)输入法前端模块(FrontEnd)
前端模块的主要功能是接受输入法服务进程中来自客户端应用程序的的请求,然后把请求转发给具体的输入法引擎或者配置模块,最后把处理的结果返回给刚才请求的客户端应用程序(在这里,输入法是作为一个服务进程来实现的)。SCIM输入法前端也有不同的实现,这些实现都遵循FrontEndBase接口规范。
3)输入法引擎模块(IMEngine)
输入法引擎的功能是实现具体的输入法。比如要实现全拼输入法,五笔输入法,首先需要实现一个输入法引擎(SCIM中的输入法引擎也有多种实现,这些实现都遵循IMEngineInstanceBase接口规范),然后编译成一个动态库,放在指定的目录之中。所以其它输入法都是以单独的软件包发行的,并不在SCIM的核心之列。SCIM跟具体的输入法不相关联,而是运行时动态的加载进来的。SCIM中的输入法引擎也有多种实现,这些实现都遵循IMEngineInstanceBase接口。
4)进程间通信模块IPC
SCIM采用的本地socket方式。应用层协议封装在Transaction中,它主要负责把特定的请求或事件等打包成数据包和从数据包中取出请求或事件。Socket实现数据的实际传输。服务器端使用SocketServer,客户端使用SocketClient。无论是服务器端还是客户端,Transaction并不关心,因为它使用的是Socket的抽象接口。
5)输入法Panel
对于输入法来说,Panel是不可缺少的一部分。 Panel的主要功能是提供给用户比较直观的感受,如候选字,联想词组等,也提供了一些辅助功能,如全角半角切换,中英文切换、标点切换、查看帮助信息等。Panel是有图形用户界面的,Panel必须要与特定的GUI绑定起来,SCIM虽然实现了一个基于GTK的Panel,但它是一个完全独立的工具,不管用哪一个GUI实现Panel,大部分代码都是相同或者相似的,只要稍做修改即可。SCIM把代码封装在PanelAgent和PanelClient这两个类中。前者实现所有和面板相关的socket协议,后者处理所有面板和前端的socket通信,前端用PanelClient来与Panel后台进程进行交互。
6)输入法Helper
SCIM把一些新的输入法方式,如手写输入法等进行特殊处理,通过Helper集成进来。SCIM提供了一个HelperAgent类,这个类的功能是把手写输入法的结果提交给应用程序。
3 SCIM的工作原理
在SCIM中,输入法有三大功能模块:FrontEnd,IMEngine和BackEnd。这三大模块分别实现的功能是:
FrontEnd:主要负责用户界面的显示,以及与客户程序进行交互,将客户程序的按键请求转发给IMEngine,执行IMEngine发出的各种命令,如绘制预编辑字符串等等。FrontEndBase基类负责管理所有IMEngineInstance实例。
IMEngine:接收FrontEnd发送的按键事件,然后向FrontEnd发送相应的命令,如显示预编辑字符串、向客户程序提交字符串等等。
BackEnd:管理所有的IMEngine。如全拼、双拼、五笔、手写等。
SCIM输入法工作原理图如图1所示。
在SCIM中最关键的部分是FrontEnd和IMEngine。这两部分的实现及其之间的通讯方式是SCIM较其它输入法平台最不同的地方。
FrontEnd主要完成用户界面的绘制、与客户应用程序交互,FrontEnd
Base基类负责管理所有IMEngineInstance实例这三方面工作。每个IMEngineInstance 实例用唯一的id进行标识,FrontEndBase类提供的函数和IMEngineInstance的id完成对IMEngineInstance的所有操作。FrontEnd派生类不需直接处理IMEngineInstance实例或者其指针。
ase基类负责管理所有IMEngineInstance实例这三方面工作。每个IMEngineInstance 实例用唯一的id进行标识,FrontEndBase类提供的函数和IMEngineInstance的id完成对IMEngineInstance的所有操作。FrontEnd派生类不需直接处理IMEngineInstance实例或者其指针。
IMEngine分为IMEngineFactory和IMengineInstance两个接口类。要实现具体的输入法,比如纵横汉字输入法,就必须提供这两个类的具体实现。IMengineFactory除了负责管理如词库等的输入法涉及的公共数据,还负责创建IMEngineInstance实例。IMEngineInstance类则负责把实际的按键转换为字符串。
FrontEnd和IMEngine之间的数据通信采用了一种松散的接口形式,即signal-slot技术,这样的方式可以简化编程接口。输入法引擎所需的所有动作都经由signal-slot发送给FrontEnd,而输入法引擎需要处理的事件则直接由FrontEnd调用IMEngineInstance类的相应函数来传递。
4 SCIM输入法架构的发展方向
整句输入是输入法的一个发展方向;提供更丰富的设置功能,能够满足不同用户的操作习惯也是其努力的目标。最新提出的并击技术可以大大提高打字速度,研究适合普通人使用的、比较易学的新一代的免费或低收费的并击输入法,我认为这是输入法研究的一个新的方向。
参考文献:
[1]努尔麦麦提·尤鲁瓦斯、吾守尔·斯拉木,Linux系统下基于SCIM的多语种混合输入法系统,多媒体技术及其应用本:142-143.
[2]苏哲,开源架构师谈SCIM,软件世界,2006:70-71.
[3]基于SCIM的输入法框架简介,http://wenku.baidu.com/view/eee723
E69b89680203d8257a.html.
[4]SCIM输入法架构分析,http://blog.csdn.net/absurd/.
[5]于翔、赵晨星,Linux操作系统下三种输入法架构分析,青海大学学报,2007,25(3):62-65.
关键词: SCIM;Linux;输入法
中图分类号:TP391.14 文献标识码:A 文章编号:1671-7597(2011)0820085-01
0 引言
国内最流行的Linux中文输入法是由余明俭等人开发的ZWinPro/Chinput。但由于该输入法直接依赖XIM输入法协议,而且没有考虑到对多语言环境的支持问题,因此这个输入法从架构上只支持中文输入。为了解决以上问题,苏哲等人开发了一个新的输入法框架SCIM(Smart Common Input Method)。作为新一代输入法框架,其架构设计精良,具有很好的扩充性和灵性性,代码质量也非常高。
1 SCIM输入法架构的优越性
目前,国际上有很多开发团队都在致力于开发基于SCIM框架的输入法,原因在于相对于其他的输入法架构,SCIM架构具有其独特的优越性。主要体现在:
1)支持40多种语言,包括中日韩语、东南亚各国语言、中亚各国语言以及各种拉丁语言。
2)采用完全面向对象的设计,并用C++实现。
3)高度模块化。每个功能模块都以独立插件的形式存在,非常的灵活。
4)简单的编程接口。
5)不但支持传统的键盘输入法,也支持手写识别等新式输入法。
6)输入法模块完全独立于图形界面,便于开发和跨平台移植。
2 SCIM的结构设计
有了SCIM输入法框架,输入法开发者只要编写简单的代码就可以实现自己的输入法,大大简化了输入法的开发难度。SCIM是完全模块化的,每个模块都可以完成某个功能,彼此之间非常独立,但是模块本身却是高内聚的。SCIM主要有以下几大模块:配置模块(Config)、引擎模块(IMEngine)、前端模块(FrontEnd)、进程间通信模块(IPC)、输入法Panel和Helper模块。下面简要介绍一下各个模块的特点和功能:
1)配置模块(Config)
配置模块最主要的功能就是为应用程序配置一些共享信息,以防冲突。所有的配置信息都由Config统一进行管理,其他模块存取配置信息都需要通过向它发送请求。SCIM的配置文件由Config 文件和Global文件组成,前者保存的是与输入法相关的配置信息,如输入法引擎、快捷键等参数,后者保存的是与输入法无关的配置信息,如socket超时、socket地址等信息。SCIM中的配置模块有不同的实现,但这些实现都必须遵循ConfigBase接口规范。
2)输入法前端模块(FrontEnd)
前端模块的主要功能是接受输入法服务进程中来自客户端应用程序的的请求,然后把请求转发给具体的输入法引擎或者配置模块,最后把处理的结果返回给刚才请求的客户端应用程序(在这里,输入法是作为一个服务进程来实现的)。SCIM输入法前端也有不同的实现,这些实现都遵循FrontEndBase接口规范。
3)输入法引擎模块(IMEngine)
输入法引擎的功能是实现具体的输入法。比如要实现全拼输入法,五笔输入法,首先需要实现一个输入法引擎(SCIM中的输入法引擎也有多种实现,这些实现都遵循IMEngineInstanceBase接口规范),然后编译成一个动态库,放在指定的目录之中。所以其它输入法都是以单独的软件包发行的,并不在SCIM的核心之列。SCIM跟具体的输入法不相关联,而是运行时动态的加载进来的。SCIM中的输入法引擎也有多种实现,这些实现都遵循IMEngineInstanceBase接口。
4)进程间通信模块IPC
SCIM采用的本地socket方式。应用层协议封装在Transaction中,它主要负责把特定的请求或事件等打包成数据包和从数据包中取出请求或事件。Socket实现数据的实际传输。服务器端使用SocketServer,客户端使用SocketClient。无论是服务器端还是客户端,Transaction并不关心,因为它使用的是Socket的抽象接口。
5)输入法Panel
对于输入法来说,Panel是不可缺少的一部分。 Panel的主要功能是提供给用户比较直观的感受,如候选字,联想词组等,也提供了一些辅助功能,如全角半角切换,中英文切换、标点切换、查看帮助信息等。Panel是有图形用户界面的,Panel必须要与特定的GUI绑定起来,SCIM虽然实现了一个基于GTK的Panel,但它是一个完全独立的工具,不管用哪一个GUI实现Panel,大部分代码都是相同或者相似的,只要稍做修改即可。SCIM把代码封装在PanelAgent和PanelClient这两个类中。前者实现所有和面板相关的socket协议,后者处理所有面板和前端的socket通信,前端用PanelClient来与Panel后台进程进行交互。
6)输入法Helper
SCIM把一些新的输入法方式,如手写输入法等进行特殊处理,通过Helper集成进来。SCIM提供了一个HelperAgent类,这个类的功能是把手写输入法的结果提交给应用程序。
3 SCIM的工作原理
在SCIM中,输入法有三大功能模块:FrontEnd,IMEngine和BackEnd。这三大模块分别实现的功能是:
FrontEnd:主要负责用户界面的显示,以及与客户程序进行交互,将客户程序的按键请求转发给IMEngine,执行IMEngine发出的各种命令,如绘制预编辑字符串等等。FrontEndBase基类负责管理所有IMEngineInstance实例。
IMEngine:接收FrontEnd发送的按键事件,然后向FrontEnd发送相应的命令,如显示预编辑字符串、向客户程序提交字符串等等。
BackEnd:管理所有的IMEngine。如全拼、双拼、五笔、手写等。
SCIM输入法工作原理图如图1所示。
在SCIM中最关键的部分是FrontEnd和IMEngine。这两部分的实现及其之间的通讯方式是SCIM较其它输入法平台最不同的地方。
FrontEnd主要完成用户界面的绘制、与客户应用程序交互,FrontEnd
Base基类负责管理所有IMEngineInstance实例这三方面工作。每个IMEngineInstance 实例用唯一的id进行标识,FrontEndBase类提供的函数和IMEngineInstance的id完成对IMEngineInstance的所有操作。FrontEnd派生类不需直接处理IMEngineInstance实例或者其指针。
ase基类负责管理所有IMEngineInstance实例这三方面工作。每个IMEngineInstance 实例用唯一的id进行标识,FrontEndBase类提供的函数和IMEngineInstance的id完成对IMEngineInstance的所有操作。FrontEnd派生类不需直接处理IMEngineInstance实例或者其指针。
IMEngine分为IMEngineFactory和IMengineInstance两个接口类。要实现具体的输入法,比如纵横汉字输入法,就必须提供这两个类的具体实现。IMengineFactory除了负责管理如词库等的输入法涉及的公共数据,还负责创建IMEngineInstance实例。IMEngineInstance类则负责把实际的按键转换为字符串。
FrontEnd和IMEngine之间的数据通信采用了一种松散的接口形式,即signal-slot技术,这样的方式可以简化编程接口。输入法引擎所需的所有动作都经由signal-slot发送给FrontEnd,而输入法引擎需要处理的事件则直接由FrontEnd调用IMEngineInstance类的相应函数来传递。
4 SCIM输入法架构的发展方向
整句输入是输入法的一个发展方向;提供更丰富的设置功能,能够满足不同用户的操作习惯也是其努力的目标。最新提出的并击技术可以大大提高打字速度,研究适合普通人使用的、比较易学的新一代的免费或低收费的并击输入法,我认为这是输入法研究的一个新的方向。
参考文献:
[1]努尔麦麦提·尤鲁瓦斯、吾守尔·斯拉木,Linux系统下基于SCIM的多语种混合输入法系统,多媒体技术及其应用本:142-143.
[2]苏哲,开源架构师谈SCIM,软件世界,2006:70-71.
[3]基于SCIM的输入法框架简介,http://wenku.baidu.com/view/eee723
E69b89680203d8257a.html.
[4]SCIM输入法架构分析,http://blog.csdn.net/absurd/.
[5]于翔、赵晨星,Linux操作系统下三种输入法架构分析,青海大学学报,2007,25(3):62-65.