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