TSF藏文输入法的设计与实现
2014-04-28高定国
高定国 郭 鑫
(西藏大学藏文信息技术研究中心 西藏拉萨 850000)
TSF藏文输入法的设计与实现
高定国 郭 鑫
(西藏大学藏文信息技术研究中心 西藏拉萨 850000)
TSF是微软推出的一种新的输入法框架,用TSF开发藏文输入法不仅能实现词组输入的功能,而且能克服现有的藏文输入法的缺陷,提高藏文键盘的输入速度。在剖析TSF输入法工作原理的基础上,定义了TSF藏文输入法的类并实现了一个基于TSF的具有藏文词组输入功能的输入法,其中重点讨论了藏文词组输入的实现过程。
TSF;藏文;输入法
引言
文本服务框架(Text Service Framework,简称TSF)[1]是微软在Windows XP以后推出的基于COM的一种新的输入法框架,可以为应用程序启用高级的文本输入和自然语言技术。TSF提供与设备无关的API,它为文本服务提供应用程序访问。TSF输入法相对于原来的IMM输入法,在技术上更易扩展和维护;在使用上支持键盘输入、手写识别输入和语音识别输入,功能更强大。TSF框架下的输入法和应用程序在逻辑上是独立的,在TSF框架下开发输入法,开发人员无需关心使用文本服务的应用程序是如何实现的,也无需知道操作系统内部的调用关系,只需要完成相应的文本服务接口就可以了。
TSF框架是基于COM技术的[2],而COM技术在VC上的实现是基于多重继承、虚函数和动态链接库技术的。因此,在TSF框架下开发文本服务,必须使用OO(Object Oriented,面向对象)编程思想,但无需设计底层的类和接口,只要继承所需要的接口,并将其实现即可。[3]
藏文输入法较多,但每种输入法都有一定的缺陷,比如以微软操作系统自带的藏文输入法为例,能输入所有的藏文字符,字符编码也是基于Unicode的,但在解决“藏文基本字符大于基本键盘可用键位”这一矛盾时,用了“组合键位”、“标示键”等方案,其结果是输入规则特殊化,输入编码增长,不能“一键一字符”地输入藏文字符[4]。从藏文字符本身的属性来看,藏文是拼音文字,但一个音节的组合不是任意的,其上下前后字符都受文法严格的限制,能组合的只有18000多音节[5],这些音节又类似于汉语的“字”,参与“组词”,多个音节组合在一起成词,一个音节也参与多个词的组合。用TSF技术开发藏文输入法不仅能实现词组输入的功能,而且能克服现有一些藏文输入法的缺陷,提高藏文键盘的输入速度。
1 TSF输入法工作原理剖析
TSF负责管理键盘布局、显示语言栏(用于切换键盘布局)、管理和切换活动的输入方法编辑器,并提供允许文本服务连续访问应用程序文档文本的抽象层。
1.1 TSF输入法框架
Windows提供了两套输入法框架:[5-6]
① IMM(Input Method Manager)[7-8]Windows XP及之前,基于纯函数API的输入法,在市面上除微软中文输入法和极品五笔2013以外很多都是基于IMM的输入法。
② TSF(Text Service Framework)框架[9]
Windows XP普及后,Windows提供新的基于COM的一个输入法框架。实际上,到了Windows Vista、Windows7所有的应用程序和各种输入控件都优先使用了TSF,但Windows Vista、Windows 7用户还能使用各种基于IMM的输入法。
Cicero(TSF的开发代号)的目标是提供一套简单通用并易扩展的框架,用于高级文本输入和自然语言处理。一个TSF能够提供诸如键盘输入、手写识别、语言识别等多语言支持和处理。TSF的框架见图1。
图1 TSF的框架图
如图1所示,文本服务框架由应用程序、文本服务和TSF管理器等3个主要部分组成。从图1中可以看到,TSF提供一个位于应用程序和输入法的间接层TIP(Text Input Processor)。可见TSF的优点在于,它是一个与设备无关、语言中立、可扩展的系统,同时给用户提供一致的输入体验。任何TSF-enabled应用程序都能从任何Text service接受文字输入,而不用考虑Text source的具体细节。同时,Text service也不用考虑各种不同应用的差别。
1.2 TSF工作原理
TSF输入法的框架与IMM输入法的框架不同,两种输入法的工作原理分别为:[10]
① IMM的工作原理
在Windows XP下,默认情况下CUAS(Cicero Unaware Application Support为所有应用程序和控件提供基本的TIP支持)是关闭的,其工作原理见图2。
图2 IMM工作原理图
如图2所示,所有“edit control”(包括Notepad)都是直接调用IMM的API,最后调用IMM输入法,而4.1版本后的“Rich Edit control”(包括WordPad等)是直接用TSF实现的输入法。
② TSF工作原理
在Windows XP下如果打开CUAS,或者操作系统是Windows Vista或Windows7的情况下,其工作原理见图3。如图3所示,IMM32和CUAS中多了一条交互,这意味着如果一个输入法实现了TIP,应用程序的所有输入由TIP实现完成。
图3 TSF工作原理图
2 TSF藏文输入法类的设计
根据藏文输入法所需要的功能,设计了TSF藏文输入法的类。类及其类之间的关系见图4。[11]
如图4所示,CTextService类为程序主类,继承并实现了TSF文本服务的四个组件ITfTextInputProcessor、ITfThreadMgrEventSink、ITfKeyEventSink和ITfThreadFocusSink,用于实现输入法激活和关闭,输入法线程管理以及词组输入等功能。
CPopupWindow类为弹出窗口类,是程序中所有窗口类的父类,其成员函数完成弹出窗口的基本功能:注册和销毁窗口,建立和关闭窗口,显示和隐藏窗口等。该类有3个子类:
① CCandidateWindow:候选词窗口;
② CInstallWindow:输入法设置窗口,用于实现皮肤管理和词库管理等输入法设置;
③ CSoftKeyboardWindow:实现软键盘窗口的功能。
CCandidateList类为候选子列表类,其成员方法完成读取码表、候选词查找等功能。
CEdieSessionBase类为编辑会话类,从ITfEditSession接口继承,是程序中其它编辑会话类的父类,其子类CKeyHandlerEditSession实现词组输入模块中输出子模块和软键盘模块的输出子模块的功能。
CLangBarItemButton为语言栏按钮类,继承了ITfLangBarItemButton、ITfLangBarItemSink和ITf-Source三个接口,用于实现输入法语言栏的管理。
图4 TSF藏文输入法的类
3 TSF藏文输入法的设计与实现
根据设计,TSF藏文输入法由输入法注册和调用模块、输入法线程管理模块、词组输入模块、换肤模块、词库管理模块和软键盘模块组成。软件的总体模块见图5。
图5 TSF藏文输入法的模块图
3.1 输入法调用和注册模块
该模块主要完成输入法注册和卸载、输入法激活和关闭、语言栏注册以及语言栏事件响应等功能,其中输入法注册和卸载用DllRegisterServer()和DllUnregisterServer()两个函数,函数中使用API函数RegSetValueEx()和RecurseDeleteKey()向注册表中添加和删除输入法dll的信息。
3.2 输入法线程管理模块
输入法线程管理模块完成以下功能:
①得到焦点
输入法线程得到文档焦点时,会重新进行一些初始化的工作,如清除编码字符串缓冲区,重绘候选词窗口等。
②失去焦点
输入法处于激活状态时,如果用户点击了输入法线程文档以外的位置,则输入法线程会失去文档焦点,此时如果候选词窗口处于显示状态,则应该隐藏候选词窗口。
③焦点改变
对输入法线程文档焦点改变的处理与失去焦点的处理一致,不同的是该代码应该放在从ITfThread-MgrEventSink组件继承的接口OnSetFocus中。
3.3 词组输入模块
藏文词组的输入是本软件的特点,也是本软件的优点,在实现藏文词组输入时,首先建立藏文字词的码表,再按照用户的输入从码表中选择合适的字词完成输入。
3.3.1 读取码表
首先建立码表,其文件的格式为:
cr为编码字符串,中间以空格隔开,后面是候选词字符串,每个候选词中间以逗号隔开。将码表文件的内容存储到内存中的时候,直接按照编码映射候选词的格式存储。这样,在需要时,就可以根据编码快速地找到候选词,然后再以逗号将候选词字符串分成一个个的候选词,供用户选择。
使用C++标准库中的文件流fstream可以方便地读取码表文件,然后使用STL中的map容器将编码字符串和候选词成对存储(存为key-value映射对),这样存储和查找的时候都比较方便。候选字符的初始化程序如下:
BOOL CCandidateList::init(){
std::wstring code,word;//code用来存储当前读到的编码字符串,word用来存储当前读到的候选词字符串
//读取系统码表文件
//打开码表文件,以二进制方式读取
std::ifstream codeTable;
codeTable.open(wstrResourcePath+L"\table.mab",std::ios::binary); //如果打开失败则返回,否则
{//跳过码表文件(文本文件)两个字节的开始符
3.3.2 候选词查找
由于已经将码表中的编码——候选词映射对存入到了map容器中,所以直接使用map容器的find函数即可实现候选词的查找。此函数底层的查找算法基于红黑树,其时间复杂度为O(logn)。[12]找到候选词字符串后,再根据逗号将其分隔成一个一个的候选词,存入数组中。
3.3.3 藏文词组的输入
在进行输入时,系统监听全局键盘事件,并根据不同的按键消息进行不同的响应。首先实现CKey-HandlerEditSession::DoEditSession接口,在此函数中根据接收到的不同的按键虚拟码,调用不同的处理函数:
3.3.4 藏文词组的输出
在输入模块中,已经接收了各种按键的消息,并调用了各个处理函数对不同的按键消息进行处理。输出模块的代码就在这些按键处理函数中,由于各种按键处理函数的逻辑基本一致,所以在此仅以字符按键处理消息为例来看处理过程。
3.4 皮肤管理模块
皮肤的管理实际上就是对皮肤列表文件和正在使用的皮肤文件的管理。完成皮肤的导入、删除和修改,本文重点关注藏文词组的输入,故该功能不再赘述。
3.5 词库管理模块的实现
一个功能完善的词组输入法不仅要有软件设计者提供的词组,作为系统词库,还要有用户自定义的词库,作为用户词库。对词库的管理,实际上就是对用户定义的词库进行管理,用户码表文件的格式与系统码表文件的格式可以设为一致,对用户词库应该具有新增、删除和修改等额外功能。
3.5.1 新增
在设置窗口消息处理回调函数LRESULT CALLBACK CInstallWindow::_WindowProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)中,能加入用户码表中编码—候选词映射对的代码:
//获取编辑框中的编码字符串和候选词字符串//定义存储用户码表信息multimap的迭代器
3.5.2 删除
词库中编码——候选词映射对的删除,也是对内存中的multimap容器进行操作。使用API函数SendMessage获取编辑框中的编码字符串和候选词字符串,在muiltmap中find获取编码字符串,若存在该词则使用erase函数删除,否则不进行任何操作。
3.5.3 修改
对词库中编码——候选词映射对的修改,也是对内存中的multimap容器进行操作。使用API函数SendMessage获取编辑框中的编码字符串和候选词字符串。在muiltmap中find获取编码字符串,若存在该词,则将其value改为获取的候选词字符串,否则不进行任何操作。
另外,对存储用户码表的内存区域操作完成后,必须更新外存中的用户码表文件,可以使用重写用户码表文件来完成。
3.6 软键盘窗口事件响应模块
软键盘窗口事件的响应,与设置窗口的事件响应处理一致,不同的是对于具体的消息两种窗口的处理方式不同而已。在软键盘窗口回调函数的WM_PAINT消息响应中,使用TransparentBlt函数绘制字符按钮和特殊按钮(Tab等);在软件盘窗口回调函数的WM_PAINT消息响应中,根据光标点击的位置,绘制按钮被按下的图案;在WM_LBUTTONDOWN和WM_LBUTTONUP消息响应中,使用系统函数keybd_event模拟物理键盘按键按下和弹起的状态。
4 小结
由于TSF输入法程序最终生成的并不是exe可执行程序,而是一个供TSF manager调用的dll,所以对其调试的方法比较特殊。以在notepad下调试为例:首先打开工程,生成32位或64位的Debug版本,然后在cmd下使用regsvr32命令注册dll;再打开记事本——设置断点——调试——附加到进程——选择notepad进程——附加,此时焦点会切换到打开的记事本,激活输入法,就可以进行调试了。
经过测试,TSF藏文输入法的设计完成了一款具有词组输入、皮肤管理、词库管理和软键盘功能的TSF输入法,如图6所示。
图6 TSF藏文输入的测试
目前正在使用的藏文输入法虽多,但都存在一定的缺陷,如,班智达藏文输入法虽能输入部分词组但也是基于IME的输入法,央金藏文输入法、阳光藏文输入法、微软操作系统自带的藏文输入法等除了都没有词组输入功能外,还都是采用IME的输入法。汉字输入法方面据报道也只有微软中文输入法和极品五笔2013以外都是基于IME的输入法。TSF输入法在很多方面比IME输入法更有优势,按照微软的说法,TSF会最终取代IME。[13]本文设计实现了一个基于TSF的具有藏文词组输入功能的藏文输入法,克服了现有藏文输入法的缺陷,也为藏文输入法的使用人员提供了一个使用方便、快捷的藏文输入软件,同时也为开发TSF不同文种输入法提供了一个参考。
[1][9][10]TSF(Text Service Framework)简介[EB/OL].http://blog.csdn.net/mspinyin/article/details/6137709,2011-01-14.
[2]Dale Rogerson.Inside COM[M].Seattle:Microsoft Press,1994.
[3]Stanley B.Lippman,Josee Lajoie,Barbara E.Moo.C++Primer[M].北京:人民邮电出版社,2006.
[4]高定国,珠杰.藏文信息处理的原理与应用[M].成都:西南交通大学出版社,2013.
[5]高定国,龚育昌.现代藏字全集的属性统计研究[J].中文信息学报,2005(1):71-75.
[6]刘政怡,李炜,吴建国.基于IMM-IME的汉字键盘输入法编程技术研究[J].计算机技术与发展,2006(12):43-48.
[7]朱巧明,李培峰,杨季文.基于Windows 9x/2000/NT平台汉字输入法的设计[J].小型微型计算机系统,2000(11):1217-1220.
[8]李培峰,朱巧明.析Windows95/98/NT平台多种IME的设计技术[J].计算机工程与科学,2000(4):67-70.
[11]郭鑫.基于TSF藏文输入法的设计与实现[D].拉萨:西藏大学,2013.
[12]Jon Kleinberg,Éva Tardos.Algorithm Design[M].Addison-Wesley,2005.
Design and Implementation of TSF in the Input Method of Tibetan Text
Gao Ding-guo Guo-Xin
(Tibetan Information Technology Engineering Research Center,Tibetan University,Lhasa 850000,Tibet)
TSF is a new framework of text input method released by Microsoft.TSF developed in the Tibetan text input method is not only to achieve phrase input function but also overcome some of the deficiencies existed in the Tibetan text input method and to improve the input speed of Tibetan keyboard.In the present paper,the class of TSF Tibetan text input method was defined to implement a TSF input method with Tibetan phrase input function based on the analyzing the working principle of the TSF input method,mainly focused on the implementation process of Tibetan phrase input.
TSF;Tibetan;input method
TP391.1
A
1005-5738(2014)02-071-10
[责任编辑:索郎桑姆]
2014-06-18
2014年度国家自然科学基金重点项目“跨语言社会舆情分析基础理论与关键技术研究”阶段性成果,项目号:61331013
高定国,男,藏族,四川阿坝人,西藏大学藏文信息技术研究中心副教授,硕士研究生导师,主要研究方向为藏文信息处理。