【摘要】Linux系統的輸入法存在多種框架和實現,以往的標準化努力沒有給出令人滿意的結果,輸入法引擎(IME)接口標準化采用了新的路線,有助于開發可適用于不同框架的IME。在總結歸納現有輸入法框架基礎上,分析了對IME接口進行標準化的基本原理,詳細說明了IME接口標準的重要特性和設計原則;相關的實體被劃分到4個部分,使用時序圖對不同部分的交互進行了細致的分析,其設計和實踐可供開發符合標準的IME時參考。
【關鍵詞】中文信息處理;輸入法;輸入法引擎;Linux標準化
【中圖號】TP3-0【文獻標示碼】A【文章編號】1005-1074(2008)11-0225-01
1標準化輸入法引擎API
1.1標準化路線的改變以往對輸入法標準化的對象分別是輸入法客戶使用輸入法的API和輸入法框架的工作協議,隨著系統的演進、國際化水平的提高,原有標準已經不再能滿足用戶需求,其約束力也在減弱。中文Linux標準對輸入法標準化對象的選擇,是以往標準認定的屬于特定框架實現內部事務的輸入法引擎API,從輸入法發展情況看,這一全新的標準化路線不僅合理,而且可行。制定一個更好的標準取代現有標準并不容易現實,目前多種XIM 替代框架都在發展,各有優勢和用戶群,用標準形式對競爭前景尚不明朗的技術做出選擇顯然不是明智之舉。此外,XIM協議標準化是為了在單一的框架中允許不同實現,從實踐情況看,這種標準化方式的意義也值得推敲。多種框架并存的現狀可能長期存在,對不同類型系統綜合考慮時更是如此,輸入法引擎API標準化是在這一前提下的合理選擇。此標準化路線的可行性根源在于不同框架下的接口語義是相似的,實際的差異主要來自不同的編程風格和功能劃分,在綜合分析現有框架下輸入法引擎接口的基礎上,提出一個更合理、更完備的API定義是完全可能的。
1.2主要特性設計既然多種輸入法框架并存的現狀必須面對,“框架獨立性”就成為輸入法引擎API標準設計的一個基本出發點。為適應不同框架要求,需要對標準API應具備的能力做出取舍,一些依靠特定框架結構才能實現的特性將不在標準中做出要求,一些只對特定框架才有意義的信息也不通過標準接口暴露給輸入法引擎。輸入法引擎API標準對輸入法應具有的標準界面做出了規定,不是對標準界面的外觀進行具體定義,而是對所需界面元素以及相應功能進行了規范;設計基于領域內的最佳實踐,并充分考慮了動態載入的特性和輸入法引擎個性化的要求。自畫界面支持是標準的重要部分,以前對此沒有進行過有效規范。自畫界面不僅可用于輸入法引擎提供自己的操作界面,而且可用于開發非鍵盤輸入法引擎和各種輸入法輔助工具。支持自畫界面的關鍵是提供輸入法引擎與框架、輔助界面進程與框架之間的雙向通信通道,標準最終定義了一個通用的通信機制。
1.3接口設計的一些原則首先是在保證接口功能語義的前提下盡可能使接口形式簡單直觀,以便輸入法引擎開發者理解和使用;其次是簡化依賴關系,輸入法引擎以模塊形式被框架加載,模塊必須提供一個特定名字的注冊函數作為與框架交換所有信息的入口,模塊對框架不存在依賴關系。這種單向依賴避免了讓不同框架提供同名函數庫的方法可能帶來的二進制兼容問題。另一個原則是讓輸入法引擎模塊包含足夠的自說明信息,這樣可以避免依靠外部配置文件來載入模塊,便于輸入法引擎在不同框架下的部署。
2輸入法引擎API標準概況
2.1設計模型輸入法引擎API設計模型中有4個基本部件:IMM負責載入輸入法引擎模塊并進行管理;IME以模塊形式實現輸入法邏輯;Helper Manager載入輔助模塊并進行管理;Helper以模塊形式實現輔助功能Helper部分最初為自畫界面而設計,后來已超出單純界面的作用,可用于實現各種輔助功能,所以用Helper命名。輸入法引擎API由IMM/IME接口和Helper Manager/Helper接口構成。實際系統中輸入法部件的動態運行機制可以有很大不同,從進程模型看,不同IME在IMM 進程中(如果是庫模式,可能就在應用程序進程中)運行,Helper則一般會在獨立進程中執行,不同Helper進程應該由一個Helper Manager根根進程創建,并在創建過程中建立與框架中其他部分的通信信道,具體過程是各輸入法框架實現定義的,并不反映在標準內容中。
2.2標準界面的工作流程對使用標準界面的輸入法引擎而言,需要關心的只是IME/IMM接口,進程的主循環在IME之外,IME提供了一系列接口函數,供IMM在不同時機調用。IMM載入IME模塊的過程是最初入口,通過使用系統提供的動態加載函數載入模塊,獲得模塊注冊函數訪問入口,以有效的IMM函數集結構和空白IME函數集結構作為參數調用該注冊函數,IMM和IME雙方即可獲得使用對方功能所需的全部入口。以上載入過程基本也適用于Helper模塊的載入。
IME和IMM 之間的部分典型交互過程以及觸發時機示例如下:①初始化過程。給IME一個初始化自身的機會,IMM完成模塊載入過程后進行。②創建輸入法上下文(IC)。讓IME有機會建立自己的私有IC數據,當輸入法客戶程序要求建立IC時進行。③按鍵處理。當用戶按鍵時進行,讓IME能對按鍵進行處理,實現輸入法邏輯。④界面事件處理。使IME能對IMM標準界面事件做出相應,例如鼠標選擇候選頁翻頁、鼠標操作改變預編輯區光標位置等。
3基于標準的輸入法引擎實現
使用標準界面的輸入法引擎Unicode內碼輸入法,功能是輸入包括替代對(surrogate pair)在內的UTF-16編碼,提交對應字符的UTF-8編碼。由于加入了替代對處理,對預編輯區的顯示和編輯都有較為完整的處理,另外加入了候選列表處理以便測試候選顯示功能。