高定國(guó) 郭 鑫
(西藏大學(xué)藏文信息技術(shù)研究中心 西藏拉薩 850000)
TSF藏文輸入法的設(shè)計(jì)與實(shí)現(xiàn)
高定國(guó) 郭 鑫
(西藏大學(xué)藏文信息技術(shù)研究中心 西藏拉薩 850000)
TSF是微軟推出的一種新的輸入法框架,用TSF開發(fā)藏文輸入法不僅能實(shí)現(xiàn)詞組輸入的功能,而且能克服現(xiàn)有的藏文輸入法的缺陷,提高藏文鍵盤的輸入速度。在剖析TSF輸入法工作原理的基礎(chǔ)上,定義了TSF藏文輸入法的類并實(shí)現(xiàn)了一個(gè)基于TSF的具有藏文詞組輸入功能的輸入法,其中重點(diǎn)討論了藏文詞組輸入的實(shí)現(xiàn)過程。
TSF;藏文;輸入法
文本服務(wù)框架(Text Service Framework,簡(jiǎn)稱TSF)[1]是微軟在Windows XP以后推出的基于COM的一種新的輸入法框架,可以為應(yīng)用程序啟用高級(jí)的文本輸入和自然語(yǔ)言技術(shù)。TSF提供與設(shè)備無(wú)關(guān)的API,它為文本服務(wù)提供應(yīng)用程序訪問。TSF輸入法相對(duì)于原來(lái)的IMM輸入法,在技術(shù)上更易擴(kuò)展和維護(hù);在使用上支持鍵盤輸入、手寫識(shí)別輸入和語(yǔ)音識(shí)別輸入,功能更強(qiáng)大。TSF框架下的輸入法和應(yīng)用程序在邏輯上是獨(dú)立的,在TSF框架下開發(fā)輸入法,開發(fā)人員無(wú)需關(guān)心使用文本服務(wù)的應(yīng)用程序是如何實(shí)現(xiàn)的,也無(wú)需知道操作系統(tǒng)內(nèi)部的調(diào)用關(guān)系,只需要完成相應(yīng)的文本服務(wù)接口就可以了。
TSF框架是基于COM技術(shù)的[2],而COM技術(shù)在VC上的實(shí)現(xiàn)是基于多重繼承、虛函數(shù)和動(dòng)態(tài)鏈接庫(kù)技術(shù)的。因此,在TSF框架下開發(fā)文本服務(wù),必須使用OO(Object Oriented,面向?qū)ο螅┚幊趟枷?,但無(wú)需設(shè)計(jì)底層的類和接口,只要繼承所需要的接口,并將其實(shí)現(xiàn)即可。[3]
藏文輸入法較多,但每種輸入法都有一定的缺陷,比如以微軟操作系統(tǒng)自帶的藏文輸入法為例,能輸入所有的藏文字符,字符編碼也是基于Unicode的,但在解決“藏文基本字符大于基本鍵盤可用鍵位”這一矛盾時(shí),用了“組合鍵位”、“標(biāo)示鍵”等方案,其結(jié)果是輸入規(guī)則特殊化,輸入編碼增長(zhǎng),不能“一鍵一字符”地輸入藏文字符[4]。從藏文字符本身的屬性來(lái)看,藏文是拼音文字,但一個(gè)音節(jié)的組合不是任意的,其上下前后字符都受文法嚴(yán)格的限制,能組合的只有18000多音節(jié)[5],這些音節(jié)又類似于漢語(yǔ)的“字”,參與“組詞”,多個(gè)音節(jié)組合在一起成詞,一個(gè)音節(jié)也參與多個(gè)詞的組合。用TSF技術(shù)開發(fā)藏文輸入法不僅能實(shí)現(xiàn)詞組輸入的功能,而且能克服現(xiàn)有一些藏文輸入法的缺陷,提高藏文鍵盤的輸入速度。
TSF負(fù)責(zé)管理鍵盤布局、顯示語(yǔ)言欄(用于切換鍵盤布局)、管理和切換活動(dòng)的輸入方法編輯器,并提供允許文本服務(wù)連續(xù)訪問應(yīng)用程序文檔文本的抽象層。
1.1 TSF輸入法框架
Windows提供了兩套輸入法框架:[5-6]
① IMM(Input Method Manager)[7-8]Windows XP及之前,基于純函數(shù)API的輸入法,在市面上除微軟中文輸入法和極品五筆2013以外很多都是基于IMM的輸入法。
② TSF(Text Service Framework)框架[9]
Windows XP普及后,Windows提供新的基于COM的一個(gè)輸入法框架。實(shí)際上,到了Windows Vista、Windows7所有的應(yīng)用程序和各種輸入控件都優(yōu)先使用了TSF,但Windows Vista、Windows 7用戶還能使用各種基于IMM的輸入法。
Cicero(TSF的開發(fā)代號(hào))的目標(biāo)是提供一套簡(jiǎn)單通用并易擴(kuò)展的框架,用于高級(jí)文本輸入和自然語(yǔ)言處理。一個(gè)TSF能夠提供諸如鍵盤輸入、手寫識(shí)別、語(yǔ)言識(shí)別等多語(yǔ)言支持和處理。TSF的框架見圖1。
圖1 TSF的框架圖
如圖1所示,文本服務(wù)框架由應(yīng)用程序、文本服務(wù)和TSF管理器等3個(gè)主要部分組成。從圖1中可以看到,TSF提供一個(gè)位于應(yīng)用程序和輸入法的間接層TIP(Text Input Processor)??梢奣SF的優(yōu)點(diǎn)在于,它是一個(gè)與設(shè)備無(wú)關(guān)、語(yǔ)言中立、可擴(kuò)展的系統(tǒng),同時(shí)給用戶提供一致的輸入體驗(yàn)。任何TSF-enabled應(yīng)用程序都能從任何Text service接受文字輸入,而不用考慮Text source的具體細(xì)節(jié)。同時(shí),Text service也不用考慮各種不同應(yīng)用的差別。
1.2 TSF工作原理
TSF輸入法的框架與IMM輸入法的框架不同,兩種輸入法的工作原理分別為:[10]
① IMM的工作原理
在Windows XP下,默認(rèn)情況下CUAS(Cicero Unaware Application Support為所有應(yīng)用程序和控件提供基本的TIP支持)是關(guān)閉的,其工作原理見圖2。
圖2 IMM工作原理圖
如圖2所示,所有“edit control”(包括Notepad)都是直接調(diào)用IMM的API,最后調(diào)用IMM輸入法,而4.1版本后的“Rich Edit control”(包括WordPad等)是直接用TSF實(shí)現(xiàn)的輸入法。
② TSF工作原理
在Windows XP下如果打開CUAS,或者操作系統(tǒng)是Windows Vista或Windows7的情況下,其工作原理見圖3。如圖3所示,IMM32和CUAS中多了一條交互,這意味著如果一個(gè)輸入法實(shí)現(xiàn)了TIP,應(yīng)用程序的所有輸入由TIP實(shí)現(xiàn)完成。
圖3 TSF工作原理圖
根據(jù)藏文輸入法所需要的功能,設(shè)計(jì)了TSF藏文輸入法的類。類及其類之間的關(guān)系見圖4。[11]
如圖4所示,CTextService類為程序主類,繼承并實(shí)現(xiàn)了TSF文本服務(wù)的四個(gè)組件ITfTextInputProcessor、ITfThreadMgrEventSink、ITfKeyEventSink和ITfThreadFocusSink,用于實(shí)現(xiàn)輸入法激活和關(guān)閉,輸入法線程管理以及詞組輸入等功能。
CPopupWindow類為彈出窗口類,是程序中所有窗口類的父類,其成員函數(shù)完成彈出窗口的基本功能:注冊(cè)和銷毀窗口,建立和關(guān)閉窗口,顯示和隱藏窗口等。該類有3個(gè)子類:
① CCandidateWindow:候選詞窗口;
② CInstallWindow:輸入法設(shè)置窗口,用于實(shí)現(xiàn)皮膚管理和詞庫(kù)管理等輸入法設(shè)置;
③ CSoftKeyboardWindow:實(shí)現(xiàn)軟鍵盤窗口的功能。
CCandidateList類為候選子列表類,其成員方法完成讀取碼表、候選詞查找等功能。
CEdieSessionBase類為編輯會(huì)話類,從ITfEditSession接口繼承,是程序中其它編輯會(huì)話類的父類,其子類CKeyHandlerEditSession實(shí)現(xiàn)詞組輸入模塊中輸出子模塊和軟鍵盤模塊的輸出子模塊的功能。
CLangBarItemButton為語(yǔ)言欄按鈕類,繼承了ITfLangBarItemButton、ITfLangBarItemSink和ITf-Source三個(gè)接口,用于實(shí)現(xiàn)輸入法語(yǔ)言欄的管理。
圖4 TSF藏文輸入法的類
根據(jù)設(shè)計(jì),TSF藏文輸入法由輸入法注冊(cè)和調(diào)用模塊、輸入法線程管理模塊、詞組輸入模塊、換膚模塊、詞庫(kù)管理模塊和軟鍵盤模塊組成。軟件的總體模塊見圖5。
圖5 TSF藏文輸入法的模塊圖
3.1 輸入法調(diào)用和注冊(cè)模塊
該模塊主要完成輸入法注冊(cè)和卸載、輸入法激活和關(guān)閉、語(yǔ)言欄注冊(cè)以及語(yǔ)言欄事件響應(yīng)等功能,其中輸入法注冊(cè)和卸載用DllRegisterServer()和DllUnregisterServer()兩個(gè)函數(shù),函數(shù)中使用API函數(shù)RegSetValueEx()和RecurseDeleteKey()向注冊(cè)表中添加和刪除輸入法dll的信息。
3.2 輸入法線程管理模塊
輸入法線程管理模塊完成以下功能:
①得到焦點(diǎn)
輸入法線程得到文檔焦點(diǎn)時(shí),會(huì)重新進(jìn)行一些初始化的工作,如清除編碼字符串緩沖區(qū),重繪候選詞窗口等。
②失去焦點(diǎn)
輸入法處于激活狀態(tài)時(shí),如果用戶點(diǎn)擊了輸入法線程文檔以外的位置,則輸入法線程會(huì)失去文檔焦點(diǎn),此時(shí)如果候選詞窗口處于顯示狀態(tài),則應(yīng)該隱藏候選詞窗口。
③焦點(diǎn)改變
對(duì)輸入法線程文檔焦點(diǎn)改變的處理與失去焦點(diǎn)的處理一致,不同的是該代碼應(yīng)該放在從ITfThread-MgrEventSink組件繼承的接口OnSetFocus中。
3.3 詞組輸入模塊
藏文詞組的輸入是本軟件的特點(diǎn),也是本軟件的優(yōu)點(diǎn),在實(shí)現(xiàn)藏文詞組輸入時(shí),首先建立藏文字詞的碼表,再按照用戶的輸入從碼表中選擇合適的字詞完成輸入。
3.3.1 讀取碼表
首先建立碼表,其文件的格式為:
cr為編碼字符串,中間以空格隔開,后面是候選詞字符串,每個(gè)候選詞中間以逗號(hào)隔開。將碼表文件的內(nèi)容存儲(chǔ)到內(nèi)存中的時(shí)候,直接按照編碼映射候選詞的格式存儲(chǔ)。這樣,在需要時(shí),就可以根據(jù)編碼快速地找到候選詞,然后再以逗號(hào)將候選詞字符串分成一個(gè)個(gè)的候選詞,供用戶選擇。
使用C++標(biāo)準(zhǔn)庫(kù)中的文件流fstream可以方便地讀取碼表文件,然后使用STL中的map容器將編碼字符串和候選詞成對(duì)存儲(chǔ)(存為key-value映射對(duì)),這樣存儲(chǔ)和查找的時(shí)候都比較方便。候選字符的初始化程序如下:
BOOL CCandidateList::init(){
std::wstring code,word;//code用來(lái)存儲(chǔ)當(dāng)前讀到的編碼字符串,word用來(lái)存儲(chǔ)當(dāng)前讀到的候選詞字符串
//讀取系統(tǒng)碼表文件
//打開碼表文件,以二進(jìn)制方式讀取
std::ifstream codeTable;
codeTable.open(wstrResourcePath+L"\table.mab",std::ios::binary); //如果打開失敗則返回,否則
{//跳過碼表文件(文本文件)兩個(gè)字節(jié)的開始符
3.3.2 候選詞查找
由于已經(jīng)將碼表中的編碼——候選詞映射對(duì)存入到了map容器中,所以直接使用map容器的find函數(shù)即可實(shí)現(xiàn)候選詞的查找。此函數(shù)底層的查找算法基于紅黑樹,其時(shí)間復(fù)雜度為O(logn)。[12]找到候選詞字符串后,再根據(jù)逗號(hào)將其分隔成一個(gè)一個(gè)的候選詞,存入數(shù)組中。
3.3.3 藏文詞組的輸入
在進(jìn)行輸入時(shí),系統(tǒng)監(jiān)聽全局鍵盤事件,并根據(jù)不同的按鍵消息進(jìn)行不同的響應(yīng)。首先實(shí)現(xiàn)CKey-HandlerEditSession::DoEditSession接口,在此函數(shù)中根據(jù)接收到的不同的按鍵虛擬碼,調(diào)用不同的處理函數(shù):
3.3.4 藏文詞組的輸出
在輸入模塊中,已經(jīng)接收了各種按鍵的消息,并調(diào)用了各個(gè)處理函數(shù)對(duì)不同的按鍵消息進(jìn)行處理。輸出模塊的代碼就在這些按鍵處理函數(shù)中,由于各種按鍵處理函數(shù)的邏輯基本一致,所以在此僅以字符按鍵處理消息為例來(lái)看處理過程。
3.4 皮膚管理模塊
皮膚的管理實(shí)際上就是對(duì)皮膚列表文件和正在使用的皮膚文件的管理。完成皮膚的導(dǎo)入、刪除和修改,本文重點(diǎn)關(guān)注藏文詞組的輸入,故該功能不再贅述。
3.5 詞庫(kù)管理模塊的實(shí)現(xiàn)
一個(gè)功能完善的詞組輸入法不僅要有軟件設(shè)計(jì)者提供的詞組,作為系統(tǒng)詞庫(kù),還要有用戶自定義的詞庫(kù),作為用戶詞庫(kù)。對(duì)詞庫(kù)的管理,實(shí)際上就是對(duì)用戶定義的詞庫(kù)進(jìn)行管理,用戶碼表文件的格式與系統(tǒng)碼表文件的格式可以設(shè)為一致,對(duì)用戶詞庫(kù)應(yīng)該具有新增、刪除和修改等額外功能。
3.5.1 新增
在設(shè)置窗口消息處理回調(diào)函數(shù)LRESULT CALLBACK CInstallWindow::_WindowProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam)中,能加入用戶碼表中編碼—候選詞映射對(duì)的代碼:
//獲取編輯框中的編碼字符串和候選詞字符串//定義存儲(chǔ)用戶碼表信息multimap的迭代器
3.5.2 刪除
詞庫(kù)中編碼——候選詞映射對(duì)的刪除,也是對(duì)內(nèi)存中的multimap容器進(jìn)行操作。使用API函數(shù)SendMessage獲取編輯框中的編碼字符串和候選詞字符串,在muiltmap中find獲取編碼字符串,若存在該詞則使用erase函數(shù)刪除,否則不進(jìn)行任何操作。
3.5.3 修改
對(duì)詞庫(kù)中編碼——候選詞映射對(duì)的修改,也是對(duì)內(nèi)存中的multimap容器進(jìn)行操作。使用API函數(shù)SendMessage獲取編輯框中的編碼字符串和候選詞字符串。在muiltmap中find獲取編碼字符串,若存在該詞,則將其value改為獲取的候選詞字符串,否則不進(jìn)行任何操作。
另外,對(duì)存儲(chǔ)用戶碼表的內(nèi)存區(qū)域操作完成后,必須更新外存中的用戶碼表文件,可以使用重寫用戶碼表文件來(lái)完成。
3.6 軟鍵盤窗口事件響應(yīng)模塊
軟鍵盤窗口事件的響應(yīng),與設(shè)置窗口的事件響應(yīng)處理一致,不同的是對(duì)于具體的消息兩種窗口的處理方式不同而已。在軟鍵盤窗口回調(diào)函數(shù)的WM_PAINT消息響應(yīng)中,使用TransparentBlt函數(shù)繪制字符按鈕和特殊按鈕(Tab等);在軟件盤窗口回調(diào)函數(shù)的WM_PAINT消息響應(yīng)中,根據(jù)光標(biāo)點(diǎn)擊的位置,繪制按鈕被按下的圖案;在WM_LBUTTONDOWN和WM_LBUTTONUP消息響應(yīng)中,使用系統(tǒng)函數(shù)keybd_event模擬物理鍵盤按鍵按下和彈起的狀態(tài)。
由于TSF輸入法程序最終生成的并不是exe可執(zhí)行程序,而是一個(gè)供TSF manager調(diào)用的dll,所以對(duì)其調(diào)試的方法比較特殊。以在notepad下調(diào)試為例:首先打開工程,生成32位或64位的Debug版本,然后在cmd下使用regsvr32命令注冊(cè)dll;再打開記事本——設(shè)置斷點(diǎn)——調(diào)試——附加到進(jìn)程——選擇notepad進(jìn)程——附加,此時(shí)焦點(diǎn)會(huì)切換到打開的記事本,激活輸入法,就可以進(jìn)行調(diào)試了。
經(jīng)過測(cè)試,TSF藏文輸入法的設(shè)計(jì)完成了一款具有詞組輸入、皮膚管理、詞庫(kù)管理和軟鍵盤功能的TSF輸入法,如圖6所示。
圖6 TSF藏文輸入的測(cè)試
目前正在使用的藏文輸入法雖多,但都存在一定的缺陷,如,班智達(dá)藏文輸入法雖能輸入部分詞組但也是基于IME的輸入法,央金藏文輸入法、陽(yáng)光藏文輸入法、微軟操作系統(tǒng)自帶的藏文輸入法等除了都沒有詞組輸入功能外,還都是采用IME的輸入法。漢字輸入法方面據(jù)報(bào)道也只有微軟中文輸入法和極品五筆2013以外都是基于IME的輸入法。TSF輸入法在很多方面比IME輸入法更有優(yōu)勢(shì),按照微軟的說法,TSF會(huì)最終取代IME。[13]本文設(shè)計(jì)實(shí)現(xiàn)了一個(gè)基于TSF的具有藏文詞組輸入功能的藏文輸入法,克服了現(xiàn)有藏文輸入法的缺陷,也為藏文輸入法的使用人員提供了一個(gè)使用方便、快捷的藏文輸入軟件,同時(shí)也為開發(fā)TSF不同文種輸入法提供了一個(gè)參考。
[1][9][10]TSF(Text Service Framework)簡(jiǎn)介[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]高定國(guó),珠杰.藏文信息處理的原理與應(yīng)用[M].成都:西南交通大學(xué)出版社,2013.
[5]高定國(guó),龔育昌.現(xiàn)代藏字全集的屬性統(tǒng)計(jì)研究[J].中文信息學(xué)報(bào),2005(1):71-75.
[6]劉政怡,李煒,吳建國(guó).基于IMM-IME的漢字鍵盤輸入法編程技術(shù)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006(12):43-48.
[7]朱巧明,李培峰,楊季文.基于Windows 9x/2000/NT平臺(tái)漢字輸入法的設(shè)計(jì)[J].小型微型計(jì)算機(jī)系統(tǒng),2000(11):1217-1220.
[8]李培峰,朱巧明.析Windows95/98/NT平臺(tái)多種IME的設(shè)計(jì)技術(shù)[J].計(jì)算機(jī)工程與科學(xué),2000(4):67-70.
[11]郭鑫.基于TSF藏文輸入法的設(shè)計(jì)與實(shí)現(xiàn)[D].拉薩:西藏大學(xué),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
[責(zé)任編輯:索郎桑姆]
2014-06-18
2014年度國(guó)家自然科學(xué)基金重點(diǎn)項(xiàng)目“跨語(yǔ)言社會(huì)輿情分析基礎(chǔ)理論與關(guān)鍵技術(shù)研究”階段性成果,項(xiàng)目號(hào):61331013
高定國(guó),男,藏族,四川阿壩人,西藏大學(xué)藏文信息技術(shù)研究中心副教授,碩士研究生導(dǎo)師,主要研究方向?yàn)椴匚男畔⑻幚怼?/p>