專利名稱:基于Unicode的跨平臺蒙古文顯示及智能輸入方法
技術(shù)領(lǐng)域:
本發(fā)明涉及跨平臺蒙古文顯示及相應的輸入方法,尤其涉及蒙古文字在LI NUX系 統(tǒng)平臺下的顯示和智能輸入、以及WINDOWS系統(tǒng)平臺下的智能輸入。
背景技術(shù):
蒙古語言文字有著悠久的歷史,迄今仍在使用,我國少數(shù)民族中,蒙古族人口相對 較多分布也較廣,尤其在我國的內(nèi)蒙古自治區(qū),蒙古語言文字有著深刻的現(xiàn)實運用土壤,因 此隨著計算機和網(wǎng)絡在民族地區(qū)的日益普及,蒙古語言文字信息化也便日益凸現(xiàn)出其重要 性與迫切性。蒙古語是文字形狀及語法規(guī)則都比較復雜的一門語言,尤其是在信息化處理 中,它有著許多技術(shù)難點,如轉(zhuǎn)換規(guī)則、顯示方法等。現(xiàn)有的蒙古文顯示技術(shù)及相應的輸入 方法的情況如下。 Window系列產(chǎn)品中,XP之前的機內(nèi)碼主要采用兩種格式,即ANSI單字節(jié)字符編碼 和遠東字符集的雙字節(jié)字符集編碼。XP及最近出現(xiàn)的Vista的機內(nèi)碼都是Unicode (統(tǒng)一的 字符編碼標準,采用雙字節(jié)對字符進行編碼)碼UTF-16,但由于蒙古文字符分配的Unicode 編碼名義字符與蒙古文顯示實際需要的顯現(xiàn)字形存在差異,蒙古文顯示和輸入仍然存在很 大困難。目前,Windows系列操作系統(tǒng)的Vista系統(tǒng)從系統(tǒng)層支持蒙古文等幾種少數(shù)民族 語言文字的顯示和輸入,其自帶的蒙古文輸入法是Unicode輸入法,但需要用戶自行錄入 控制字符(輸入的符號信息存在多種可能時,該控制字符用來確定輸入的符號信息到底哪 一種才是自己需要的),這樣就需要用戶去背記這些控制字符,而使得蒙古文的輸入并不方 便使用和普及。 同樣Linux系統(tǒng)的輸入也存在上述缺陷。并且,Linux目前的GNOME桌面系統(tǒng)平 臺,機內(nèi)碼也遵循Unicode標準,具體采用UTF-8,在處理文本的顯示方面,GNOME平臺顯示 文本時使用的是Pango庫,迄今為止,Pango的最高版本Pango-1. 20. 0仍然不能支持蒙古 文的顯示和輸入,從而需要對其顯示進行改進以支持蒙古文的顯示和輸入,克服上述缺陷。
發(fā)明內(nèi)容
本發(fā)明的目的是針對上述的現(xiàn)有技術(shù)所存在的缺陷,提供一種在LINUX系統(tǒng)的 GNOME桌面系統(tǒng)平臺上顯示蒙古文的方法,進一步在此基礎上能夠改進LINUX的GNOME桌 面系統(tǒng)和WINDOWS系統(tǒng)的蒙古文智能輸入,在Li皿x的GNOME系統(tǒng)上實現(xiàn)蒙古文的顯示和 Unicode蒙古文拼音智能輸入法,使得蒙古文能夠在LINUX系統(tǒng)下同WINDOWS系統(tǒng)下一樣 正確顯示,在此基礎上,進而實現(xiàn)LINUX系統(tǒng)和WINDOWS系統(tǒng)下對蒙古文字符錄入時控制字 符的自動添加,改進現(xiàn)有輸入法的不足。最終,實現(xiàn)了跨平臺蒙古文顯示和智能輸入,填補 了 Li皿x環(huán)境的桌面系統(tǒng)GNOME環(huán)境下不支持蒙古文輸入法的空缺,在一定程度上推動了 Linux系統(tǒng)在民族地區(qū)的普及。 本發(fā)明的在LINUX系統(tǒng)的GNOME桌面系統(tǒng)平臺上顯示蒙古文的方法,包括在 GNOME桌面系統(tǒng)的處理文字語言的Pango系統(tǒng)中,建立蒙古文處理系統(tǒng)引擎;其特征在于,向?qū)嵤┪淖终Z言處理的Pango系統(tǒng)注冊蒙古文處理系統(tǒng)引擎名,形成蒙古文處理系統(tǒng)引擎 與操作系統(tǒng)的文字語言處理系統(tǒng)之間的接口 ;在蒙古文處理系統(tǒng)引擎中生成蒙古文處理模 塊,所述蒙古文處理模塊基于OpenType字體的規(guī)則和結(jié)構(gòu),構(gòu)造選形引擎以對OpenType的 蒙古文字體進行選形替換,經(jīng)過選形替換后獲得正確的蒙古文顯示結(jié)果。進一步的,GNOME 桌面系統(tǒng)采用Unicode國際標準編碼處理蒙古文字符,區(qū)分文本中要顯示的字符是否為蒙 古文字符,是則進入蒙古文處理系統(tǒng)引擎,否,則不需要進入,從而使得混合文本顯示得以 實現(xiàn)、使得該引擎能夠跨操作系統(tǒng)平臺接入使用;其中,先對蒙古文文本按字形簇為單位進 行劃分即分簇后、找到該字形簇對應的字形索引串完成貼標簽的操作、再根據(jù)形成的貼有 標簽信息的字形串緩沖訪問0penType字體中的GSUB表進行循環(huán)的選形替換處理。進一步 的,基于上述顯示方法,實現(xiàn)控制字符的選擇輸入,在蒙古文處理系統(tǒng)引擎的蒙古文處理模 塊中添加輸入法控制板Panel,利用xfc渲染引擎進行輸入,先在SCIM框架協(xié)議下建立輸 入法的接口 ,依據(jù)Pango系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中預輸出的方式生成候選詞窗口 ,將蒙古 文候選詞(包括控制字符的)顯示出來,以便進行選擇輸入來確定最終需要輸入顯示的內(nèi) 容,從而不必用戶背記各類控制字符方便了蒙古文計算機使用的普及面。其中,選形引擎根 據(jù)蒙古文文字的特征,以字形簇為單位劃分蒙古文文本,分析字形簇,為字形簇貼上特征標 簽以標記使用對應的0penType字體中的替換規(guī)則進行替換,反復選形和替換之后獲得正 確的蒙古文顯示結(jié)果。類似的,也可以提供在Windows系統(tǒng)下的顯示和智能輸入方法,在 Windows系統(tǒng)處理文字語言的系統(tǒng)中建立蒙古文處理系統(tǒng)引擎;向?qū)嵤┪淖终Z言處理的系 統(tǒng)注冊蒙古文處理系統(tǒng)引擎名,形成蒙古文處理系統(tǒng)引擎與操作系統(tǒng)的文字語言處理系統(tǒng) 之間的接口 ;在蒙古文處理系統(tǒng)引擎中生成蒙古文處理模塊,所述蒙古文處理模塊基于預 定的對應0penType蒙古文字體的規(guī)則和結(jié)構(gòu),生成選形引擎對0penType的蒙古文字體進 行選形替換,經(jīng)過選形替換后獲得正確的蒙古文顯示結(jié)果。在蒙古文處理系統(tǒng)引擎中建立 輸入法Panel模塊,輸入法Panel模塊其采用xft渲染引擎繪制蒙古文而形成蒙古文輸入 法引擎;所述蒙古文輸入法引擎與SCIM輸入法平臺之間建立接口,將所述蒙古文輸入法引 擎添加到SCIM輸入法平臺并由其統(tǒng)一調(diào)用和管理。其中,所述的蒙古文輸入法引擎與SCIM 輸入法平臺之間建立的接口由SCIM輸入法平臺生成。所述的蒙古文輸入法引擎對按鍵處 理時,有選擇的捕獲按鍵信息處理,其余按鍵信息由SCIM輸入法平臺處理;選擇捕獲的按 鍵信息是定義的熱鍵信息、符合蒙古文鍵盤布局的按鍵信息。蒙古文輸入法引擎利用對蒙 古文Unicode語料統(tǒng)計得到的蒙古文碼表的查找結(jié)果、利用對蒙古文0penType字體的控制 字符添加的規(guī)律分析所得到的添加控制字符的規(guī)則而添加得到的結(jié)果,合并兩個結(jié)果得到 蒙古文Unicode控制字符的候選詞。所述蒙古文處理系統(tǒng)引擎中建立的輸入法Panel模 塊,產(chǎn)生一個候選詞窗口顯示蒙古文候選詞。產(chǎn)生蒙古文候選詞顯示窗口包括根據(jù)所述顯 示蒙古文的方法將候選詞文本串轉(zhuǎn)換成字形串;所述的蒙古文輸入法引擎使用Windows的 XP/Vista系統(tǒng)下的數(shù)據(jù)結(jié)構(gòu)將要顯示的字形串進行270度旋轉(zhuǎn)成為豎向排版,并采用在內(nèi) 存中預輸出的方式防止閃屏,計算預期窗口大小尺寸;使用xft渲染引擎將候選詞輸出,記 錄和計算位置信息以正確輸出候選詞到相應的位置。 本方法實現(xiàn)了在Li皿x操作系統(tǒng)上基于Unicode編碼的蒙古文顯示及其智能輸 入,并且該蒙古文顯示方法及其智能輸入法可以與漢語及其它已裝載語言輸入法同時使用 而不影響其原有功能和應用(通過接口連接的模塊化結(jié)構(gòu)形式)。基于此,通過更換布局引
6擎,可以比較容易的移植到Li皿x KDE及Windows等系統(tǒng)下。目前已將其移植到Windows的XP和Vista系統(tǒng)下,運行穩(wěn)定。本輸入法具有簡單易學、錄入速度快、控制字符自動添加等諸多創(chuàng)新優(yōu)點,并且采用了 Unicode國際標準編碼處理蒙古文字符,這極大地保障了蒙古文信息的交流傳輸。另外,實現(xiàn)詞庫對新詞的自動添加,增強了輸入法詞庫的開放性,另一方面可以通過用戶的輸入和交互從而提取大量的民族語言語料,進而為民族語言的監(jiān)測和研究提供有力的依據(jù),為民族工作的開展打下良好的基礎。
下面將參照附圖對本發(fā)明進行更詳細的說明,其中 圖lMStar在SCM中的配置畫面; 圖2MStar在li皿x的Gedit中的測試畫面; 圖3MStar在windows的記事本中的測試畫面; 圖4藏文0penType字體組織結(jié)構(gòu); 圖5Script、 Langimge System、 Features禾口 Lookup的關(guān)系; 圖6Pango體系結(jié)構(gòu)示意圖; 圖7蒙古文0penType字體中的Fea tures特征和Lookups替換(表); 圖8蒙古文0penType字體中的Lookups示例; 圖9SCIM的客戶服務器模式; 圖10本發(fā)明蒙古文智能輸入方法在SCIM中的配置畫面。 圖11布局引擎處理混合文本的工作流程 圖12選形引擎的實現(xiàn) 圖13詞尾規(guī)則管理示意圖
具體實施例方式
下面是如何實現(xiàn)蒙古文跨系統(tǒng)平臺顯示和智能輸入的具體方式。
LINUX系統(tǒng)的GNOME平臺顯示
蒙古文特點分析 蒙古語言文字具有悠久的歷史。在上千年的發(fā)展演變過程中前后出現(xiàn)過六種不同的文字形式?,F(xiàn)行的蒙古文分三種回鶻蒙古文、托忒蒙古文和斯拉夫蒙古文。回鶻蒙古文也叫傳統(tǒng)蒙古文或老蒙古文,是從古回鶻文經(jīng)過回鶻式蒙古文逐漸演變而來的一種拼音文字,主要通行于我國內(nèi)蒙古自治區(qū);托忒蒙古文是在舊蒙古文基礎上改制而成的拼音文字,主要通行于新疆蒙古族地區(qū);拉夫蒙古文亦稱新蒙古文或基里爾字母蒙古文,是在俄文字母的基礎上改制而成的,主要通行于蒙古人民共和國。 傳統(tǒng)蒙古文是一種比較復雜的文字,處理它的時候有一定的困難。總的來說有如下三個特征 1.傳統(tǒng)蒙古文文字的書寫格式是唯一從左到右,從上到下豎寫的拼音文字,并且在一個詞里,各個字符是連寫的。 2.與常用的漢字和英文不同,蒙古文有很多特性,傳統(tǒng)蒙古文的字符可以分為名義字符和變形顯現(xiàn)字符,并且兩者之間的轉(zhuǎn)換存在復雜的對應關(guān)系。其中"名義字符(character)"是指供組織、控制或表示數(shù)據(jù)用的元素集合的一個元素,每個字符與一個Unicode標準中的碼位(Code Point)相對應。"顯現(xiàn)字形(glyph)"是指字符的顯現(xiàn)形式,一個字符根據(jù)它在詞中的位置和前后所聯(lián)接的字符的不同有一個或多個顯現(xiàn)形式。
3.傳統(tǒng)蒙古文字符的'音'和'形'之間也存在多對多的復雜對應關(guān)系。
"某些語言文字在顯示輸出與編輯的時候,并不是按照一般語言字符(如拉丁語)那樣從左到右按線性方式布局,而是要經(jīng)過一些很特殊的處理。這樣的語言文字,就稱為復雜文字(Complex Text)"。由此可以看出,蒙古文也是一種復雜文字,在處理時存在較大的難度。 在Unicode編碼標準中,只收錄了蒙古文(包括傳統(tǒng)蒙古文、托戎文、錫伯文、滿文)176個名義字符,其中包括蒙古文中的各種符號、字母和變體選擇符、變體控制符等,沒有對蒙古文顯現(xiàn)字形進行編碼和區(qū)分。其中傳統(tǒng)蒙古文分配到35個碼位的字符編碼(編碼區(qū)間為U1820-U1842)和7個控制字符(包括三個自由變體選擇符FVS1 (U180B),F(xiàn)VS2(U180C), FVS3(U180D),蒙古文元音間隔符(U180E),零寬連接符(U200D),零寬禁連符(U200C),窄寬度無間斷空格(U202F))。
蒙古文0penType字體組織結(jié)構(gòu)分析 開發(fā)國際化軟件需遵循Unicode編碼標準,而蒙古文分配到Unicode碼位數(shù)目與其需要顯示的字形數(shù)量相差甚多,對此,本發(fā)明提供的方法,采用了 0penType字體與Unicode編碼結(jié)合。
0penType字體簡介 繼TrueType字體格式之后,微軟公司和Adobe公司聯(lián)合推出了 0penType格式,這一嶄新的字體格式不僅以壓縮方式增加了對Postscript字體的支持,同時,在Unicode編碼的大字符集基礎上,采用多語種和多語系的編排方法,以適應更多的平臺和全球性的國際字符集。此外,在功能上還容納了多項傳統(tǒng)排版軟件才可具備的基本操作,如基線調(diào)整,豎排替換,靈活定位以及字符的組合和拆分等。 0penType的字體庫中通過設置相應的標記和預定義標記的內(nèi)容來得到想要的字形,標記是OpenType字庫最主要的特點之一,字庫中可以設置四種標記字符標記(Scripttags)、語言標記(Xanguagetags)、特征標記(Feature tags)以及基線標記(Baselinetags) 0penType布局表 0penType字體在支持TrueType體系結(jié)構(gòu)的基礎上增加了一些高級排印特征,正是這些高級排印特征對復雜文本的處理提供了很好的支持,相應的特征數(shù)據(jù)放在如下的表中 (1)基線數(shù)據(jù)表(BASE :Baseline)。
(2)字形定義表(GDEF :Glyph Definition)。
(3)字形替換表(GSUB :Glyph Substitution)。
(4)字形置位表(GP0S :Glyph Positioning)。
(5)字形調(diào)整表(JSTF Justification)。 上述表統(tǒng)稱為0penType布局表(OpenType Layout Table)。布局表的出現(xiàn)也是盡最大程度地讓字體變得智能。下面簡要介紹各個表的作用
(l)BASE表 如果一行文本由不同文字組成,常常會導致字形大小不一或者字形不在同一條直線上等問題。為了解決上述問題,在BASE表中提出了基線位置(Baseline Value)和每種文字的最大/最小延伸量(min/max extents) 。 BASE表使用的模型如下假設特定大小的某種文字為文本處理中的主串(dominant run),所有其他基線均需相對于該主串進行定義。
(2) GDEF表 GDEF表為GSUB表、GP0S表提供了三類信息,在其內(nèi)部表現(xiàn)為三個子表字形分類定義(將字體中的字形分類);黏著點信息(標志了字形和其他的字形黏著的位置信息);連字的光標信息(提供了在連字中光標置位的信息和當涉及到連字時的文本選擇處理信息)。這是一個可選的表,客戶也可自行實現(xiàn)相應的功能。
(3) GSUB表 GSUB表存放了用于字形替換的信息。GSUB表中定義了如下的一些替換 ①單一替換。以一個字形替換另一個字形。 ②多替換。以多個字形替換一個字形,如連字的分解。 ③變體替換。字符的多個變體之一來替換字符對應的字形。
連字替換。以連字字形替換一串字形,是第二種替換的逆過程。 ⑤上下文替換。上面幾種替換的聯(lián)合運用,在上下文中替換一個或多個字形。 ⑥鏈上下文替換。在鏈上下文中替換一個或多個字形。
(4) GP0S表 GPOS表提供了字形置位和黏著的信息,它支持如下的幾種置位和黏著(Attachment)類型 ①單一字形的位置調(diào)整,如上標或下標。 ②相關(guān)的兩個字形的成對位置調(diào)整,如字間距的調(diào)整。 ③黏著點位置信息的。黏著點定義了一個字形和另一字形的黏著時黏著點位置的信息。 ④標記字符對應的字形與基本字符對于字形、連字及與它同類型的字形間的黏著。 ⑤依據(jù)上下文的置位,字形依據(jù)其周圍的字形而確定自己及相互間的位置。
(4) JSTF表 JSTF表為字體開發(fā)者提供了對已經(jīng)正確選形的文本進行定位和替換操作時的調(diào)整版面控制,文字處理模塊可能根據(jù)JSTF表對詞間距進行壓縮或延伸以達到使一行文本外觀和諧美觀的效果。 從對上述對于0penType字體文件中部分表的介紹可以看出,0penType提供了對 蒙古文字的名義字符根據(jù)上下文進行選形的支持,也提供了不同的民族文字混排時對齊和
進行位置調(diào)整的支持。 0penType字體結(jié)構(gòu)分析 目前0penType已經(jīng)成為一種業(yè)內(nèi)標準,越來越多的軟件支持0penType字體格式,越來越多的字體廠商將自己的字庫升級到OpenType字體格式。Microsoft從Windows 2000系統(tǒng)開始兼容0penType字庫,其系統(tǒng)自帶的西文字庫都已升級到了 0penType字體格式,蘋果公司也從MAC OS X開始完全兼容OpenType字庫。而Adobe公司不僅將自己Adobe字 體全部升級到0penType格式,還推出AdobeCreative Suite 2軟件包,其中的InDesign, Illustrator和Photoshop對0penType的排版特性都有非常好的支持。
由此可見,利用0penType字體中的布局表,可以用來很好的支持蒙古文的變形顯 示。目前,內(nèi)蒙古大學和內(nèi)蒙古師范大學也都在研發(fā)制作蒙古文0penType字體、Windows Vista操作系統(tǒng)中也附帶著微軟公司的蒙古文0penType字體。 下面以藏文0penType字體為例簡要介紹OpenType字體中的標記信息,見圖4所示。 Scripts Tag(字符標記)用于識別OpenType字體庫中所設計的字符在Unicode 編碼段中的位置。例如藏文字符的字符標記是"tibt",而蒙古文字符的字符標記是 "mong"。 Language Tag(語言標記)用于識別OpenType字庫中所設計的字符所支持的語言 系統(tǒng)。支持蒙古文的語言系統(tǒng)的語言標記應該是"mo",但為了使字體更好的能與別的語言 系統(tǒng)的字體協(xié)同工作,選用默認值"dflt"。 FeatureTags (特征標記)用于決定如何從字庫 中選擇一個字形。特征標記中可以定義字形替換、字形置位布局以及字形替換兼置位布局, 是OpenType字庫中最重要的部分。而這些Feature (特征)是定義在GSUB表中和GPOS表 中的,下面介紹GSUB和GPOS表的組織結(jié)構(gòu)及其工作原理。
GSUB和GPOS的組織結(jié)構(gòu) GSUB表和GPOS表提供的功能覆蓋了幾乎所有復雜文本處理的要求,包含了在字
形處理過程中用到的所有有關(guān)替換和相關(guān)字形置位的信息。這兩個表都是開始于一個定義
了字形鏈表(ScriptList)、特征鏈表(FeatureList)和查找鏈表(LookupList)偏移的頭。
GSUB/GPOS表中每一種替換/置位格式類型對應于一個Lookup (查找、替換)數(shù)據(jù)。Lookup
結(jié)構(gòu)包含了具體的替換和置位數(shù)據(jù)信息。圖5為GSUB/GP0S表的組織結(jié)構(gòu)。 1)字形鏈表標志了字體文件中所支持的文字和語言系統(tǒng),每種文字可由幾種語言組成。 2)特征鏈表定義了在呈現(xiàn)這些文字前語言系統(tǒng)所要求的字形替換(置位)特征。
3)查找鏈表包括所有實現(xiàn)字形替換(置位)所需的查找數(shù)據(jù)。
訪問GSUB/GP0S表的工作流程 GSUB/GP0S表以如下的方式來確定查找數(shù)據(jù)(Lookup):文字- >語言系統(tǒng)_ >相 應特征_ >查找數(shù)據(jù)。具體步驟為 1)確定當前工作的文字在表中的位置及確定文字的種類。 2)如果已知語言系統(tǒng),則在確定的文字中查詢語言系統(tǒng)表(LangSys Table);否
則使用文字表中缺省的語言系統(tǒng)表(DefaultLangSys Table)。 3)語言系統(tǒng)表提供了特征鏈表的索引數(shù),以此可訪問所需求的特征。 4)檢查每個特征的特征標簽,選擇要應用到字形串的特征(Feature)。 5)每個特征又提供了到查找鏈表(LookupList Table)的索引數(shù)數(shù)組。查找數(shù)據(jù)
(Lookup Data)是在一個或多個子表中定義,這些子表定義了特定字形及對其實施各種操
作的信息。 6)組合所有的由特征集對應的查找數(shù)據(jù),并應用它們實施具體的替換和置位操 作。
訪問0penType字體中的布局表,需要用到布局引擎(LayoutEngine),不同的操作 系統(tǒng)平臺有著不同的布局引擎,甚至一些大型的文字處理軟件也有其自己的布局引擎。
因此,將結(jié)合OpenType字體與Unicode來實現(xiàn)本發(fā)明的蒙古文顯示和智能輸入。
操作系統(tǒng)的布局引擎簡介 使用OpenType字體需要布局引擎支持實現(xiàn)蒙古文的顯示和輸入。不同的操作系 統(tǒng)有著不同的布局引擎如Windows系統(tǒng),其布局引擎是Uniscribe ;現(xiàn)行的Linux操作系 統(tǒng)最常用的桌面系統(tǒng)GNOME系統(tǒng)使用的布局引擎是Pango。
Uniscribe Uniscribe是微軟公司開發(fā)的Windows操作系統(tǒng)為高質(zhì)量排版文字和處理復雜文 字而開發(fā)的組件。不論是簡單文本還是復雜文本若需要高質(zhì)量的排版,需要一種特殊的處 理方法,因為字符("字形")不是按照一個簡單的布局方式。對于復雜文本,管理字形的形 狀和位置的規(guī)則被指定的存放在符合Unicode編碼的OpenType字庫中。
Uniscribe從Windows 2000開始連同Windows —起捆綁;Win9x的用戶在更新至 Internet Explorer 5. 0之后,系統(tǒng)亦會安裝有本組件。系統(tǒng)的核心是一個名為USP10. DLL 的動態(tài)鏈接庫。此外,WindowsCE從5. 0開始亦支持Uniscribe。
Pango Pango是GTK+和GNOME的分支,其目標是在GTK+GN0ME環(huán)境中進行操作,支持國際 上主要語言的輸出。 Pango庫是實現(xiàn)多種語言文字處理輸出的一個系統(tǒng),可以處理Unicode編碼的文 本,其本身采用模塊化編程思想。語言模塊分為兩種, 一種是基本處理模塊,對文字只是簡 單的處理,不包括對字形的選形等操作,在基本模塊中支持羅馬文字、希臘文、西里爾文、簡 體中文和繁體中文以及日文。另一種語言模塊是針對復雜文字的語言模塊,于此,通過在 Pango庫的復雜文字語言模塊中,接入蒙古文選形引擎模塊,實現(xiàn)蒙古文從名義字符到變形 顯現(xiàn)字符的替換,從而完成支持蒙古文在GNOME平臺上的變形顯示。 這里,Pango以模塊化方式、根據(jù)處理語言和文字時的流程對模塊進行了詳細的劃 分,按照模塊與待處理的文字究竟屬于哪種語言相關(guān)與否,進行相應的劃分,選用不同的文 字處理模塊進行字符的選形與顯示,因而其僅對Pango新植入處理模塊,對整個Pango庫的 修改最小并且簡便易于移植。 傳統(tǒng)蒙古文在LINUX-GNOME的正常顯示的實現(xiàn)模塊如圖11所示
Pango中對實現(xiàn)蒙古文變形顯示的支持 Pango的體系結(jié)構(gòu)如圖6所示。Pango位于底層庫函數(shù)和上層應用程序工具集 (ToolKit)之間,處理從上層應用程序傳遞下來的文字信息,主要負責各種文字的選形、顯 示、界面處理等工作;Pango除了包含Pango的核心之外還包括一系列與X(與窗口顯示或 消息處理的底層)相關(guān)的函數(shù)集合,以及字形和語言函數(shù)集合,為操作系統(tǒng)的桌面系統(tǒng)、應 用程序等和底層庫函數(shù)之間架起了一座橋梁。 構(gòu)造Pango的內(nèi)部組織結(jié)構(gòu),對于不同語系的Unicode文本采用相應的語言處理
模塊進行處理。定義Pango庫中的關(guān)鍵類 PangoEngine類-處理語言文本的引擎 PangoEngineClass類——處理語言文本的引擎具體封裝的實現(xiàn)
11
PangoEngineShape類(處理的是基于字體規(guī)則的語言文本)、PangoEngineLang類 (處理的是基于詞典規(guī)則的語言文本)——構(gòu)造具體的引擎,為特定的語言文本設計的具體 的選形系統(tǒng),是Pango的一個獨立的部分。這些引擎與Pango進行以管道方式進行數(shù)據(jù)交 流。本發(fā)明即通過具體實現(xiàn)該選形系統(tǒng)完成蒙古文的PANG0下的顯示。PMigoEngineSh即eClass類、PangoEnginel^ngClass類-封裝了具體的選形顯
示的方法。實現(xiàn)如下功能給定一個字體, 一段文本和一個PangoAnalysis文本分析結(jié)構(gòu), 將文本中的字符串轉(zhuǎn)化為目標結(jié)果字形串。并將結(jié)果字形串保存在PangoGlyphString結(jié) 構(gòu)中,最終提供給操作系統(tǒng)或者字處理程序輸出。 各個與語言文字處理和顯示有關(guān)的模塊等,都放在Pango的modules模塊子目錄 下,在編譯時將這些模塊編譯成動態(tài)鏈接庫,布局引擎在處理文本時,首先按照文本中的字 符編碼將文本確定為某個語系,接著調(diào)用相應的處理模塊進行處理,產(chǎn)生最終的目標字形 串。 在Pango庫中定義了一個PangoScript枚舉類型,在PangoScript中定義了各個 語系的標識,蒙古文定義為PANG0_SCRIPT_M0NG0LIAN即標識明確運行的是蒙古文語系的 處理系統(tǒng)(如蒙古文處理引擎等)。在Pango中定義了 PANG0_M0DULE_ENTRY即Pango與 各個模塊的接口方法,其參數(shù)可以是init, exit, list, create,分別代表各個模塊的不同 動作。Pango中又定義了 PANGO_ENGINE_SHAPE_DEFINE_TYPE(name, prefix, class_init, instance」nit)方法,從而規(guī)定了各個模塊引擎注冊的名字,模塊引擎的符號,模塊引擎的 初始化,以及模塊引擎實例的初始化。 Pango中建立蒙古文處理模塊(Unicode編碼標準的支持) 蒙古文處理模塊是遵循Unicode編碼標準的蒙古文選形,Li皿x機內(nèi)碼支持 Unicode編碼標準。 從Pango內(nèi)部組織結(jié)構(gòu)及模塊的工作原理角度而言,蒙古文同其他語言一樣也占 用相應的一段Unicode編碼區(qū)間,且PangoScript枚舉類型中也為蒙古文定義了相應的語 系標記。 蒙古文的變形是基于字體配置的,處理模塊完成蒙古文選形的過程即通過每個類 具體封裝而實現(xiàn)具體蒙文選形顯示方法。 如定義PangoEngineSh即e為MongolianEngineFc、 PangoEngineSh即eClass 為Mongol ianEngineSh即eFcClass即確定是進行蒙古文字形選形。新定 義PangoEngineScriptinfo類型數(shù)據(jù)mongolian_scripts為{PANG0_SCRIPT_ MONGOLIAN, 〃 *〃 }、重寫PANGO_ENGINE_SHAPE_DEFINE_TYPE方法為PANG0_ENGINE_SHAPE_ DEFINE_TYPE (MongolianEngineFc, mongolian_engine_fc, mongolian_engine_fc_class_ init, NULL)等,從而在mongolian—engine—shape中實現(xiàn)蒙古文選形。后面將描述封裝的 方法的具體實施流程。 Pango添加蒙古文處理模塊實現(xiàn)蒙古文正確顯示(0penType字體的支持)
蒙古文的正確顯示至少需要用到0penType字體的GSUB表,組成結(jié)構(gòu)如圖7所 示。圖7的字體中定義了六個Feature特征,即calt, init, isol, medi, rlig, f ina,分別 表示上下文替換、詞首替換、獨立體替換、詞中替換、連體替換、詞尾替換。這些Feature將 0penType字體中的字形替換規(guī)則進行了分類,對這些規(guī)則進行管理。字體中的替換規(guī)則都
12放在Lookup替換表中, 一個Lookup對應的一條替換規(guī)則。眾多的Lookup歸屬于定義的
Feature。圖8是隸屬于init特征的一些Lookup。如蒙古文字符^,在詞首的時候應該顯示
為1r,此時會用到上圖中的第一個Lookup。每一個Lookup都定義為若干個字形串轉(zhuǎn)化為若
干個字形串的形式,可能是一個字形替換為一個字形,也可能是多個字形替換成一個字形,
還有可能是幾個字形替換為另幾個字形。 蒙古文的iH確、話示大體會受到l下沭規(guī),則的制約: 1)字符在詞里的位置。有些字符在詞首、詞中、詞尾、獨立體的顯示是各不相同的。
2)自由變體選擇符FVS1、FVS2、FVS3的選擇。程序或使用者可以選擇不同自由變 體選擇符,將鄰近的字形替換成相應的字形進行顯示。 3)音節(jié)、詞性引起的變形,蒙古文的一個詞分為若干個音節(jié),由元音和輔音組成的
音節(jié)以及詞性(陰性、中性、陽性)都會影響字形的變形。音節(jié)與音節(jié)之間的相互關(guān)系也有
可能導致變形。 選形實現(xiàn)過程 在PANG0系統(tǒng)下,實現(xiàn)蒙古文處理模塊的接口 。在PANG0的復雜語言文 字處理模塊中,定義語言處理引擎系統(tǒng)名稱,比如,定義SCRIPT_ENGINE_NAME—— "MongolianScriptEngineFc",以標識本蒙古文選形系統(tǒng)引擎的名字、將PangoEngineSh即e 定義為MongolianEngineFc,將PangoEngineShapeClass定義為MongolianEngineFcClass, 定義PangoEngineScriptlnfo結(jié)構(gòu)類型數(shù)據(jù)mongolian_scripts為{PANG0_SCRIPT_ MONGOLIAN, " * " }等,以與蒙古文選形處理相對應。實現(xiàn)PANGO_ENGINE_SHAPE_DEFINE_ TYPE (MongolianEngineFc, mongolian_engine_fc, mongolian_engine_fc_class_init, NULL),從而對蒙古文引擎進行定義和關(guān)聯(lián)。重寫了 PANG0_M0DULE_ENTRY的四個方法,尤其 是PANG0_M0DULE_ENTRY(create)和PANG0_M0DULE_ENTRY (init)。其中在PANG0_M0DULE_ ENTRY (create)方法中如果當前Pango引擎的ID號即名稱與本模塊引擎的名字相同(如 I D指的是蒙古文處理,與本模塊引擎也是蒙古文處理引擎名稱相同),于是PANGO中復雜 語言處理模塊就會創(chuàng)建一個新的蒙古文引擎。而PANG0—M0DULE—ENTRY(init)方法中,向 PANGO的管理模塊注冊新的蒙古文引擎模塊。還有其他的兩個模塊方法與上述兩個類似, 不再贅述。總的來說,是通過在PANGO系統(tǒng)關(guān)于復雜語言處理的模塊部分,定義蒙古文處理 系統(tǒng)引擎的名稱由復雜語言處理模塊根據(jù)名稱創(chuàng)建該引擎,或?qū)⒃撎幚硐到y(tǒng)引擎模塊的名 稱注冊到PANGO系統(tǒng)的管理模塊進而接入該引擎等,從而在PANGO系統(tǒng)下構(gòu)造接口 ,建立起 PANGO系統(tǒng)的蒙古文處理系統(tǒng)引擎。
蒙古文處理模塊的選形引擎實現(xiàn): 在mongolian_engine_fc_class_init函數(shù)中選擇當前選形引擎為mongolian— engine—shape完成選形顯示方法。下面是mongolian_engine_shape蒙古文選形顯示的具 體實現(xiàn)過程。 本發(fā)明的蒙古文變形顯示方法,在其實現(xiàn)過程中,字形需要使用合適的lookup替 換表來進行替換才能正確顯示(0penType字體的GSUB表中的lookup替換規(guī)則),而所有的 lookup是按Feature來分類的,所以需要將feature進行標記。再將文本中的字形進行合 適的標記,用兩者的標記信息進行匹配,使得字形可以通過合適的Feature中的Lookup進 行替換
13
1) OpenType字體中Feature的屬性值定義與待選形字形屬性值的定義
通過查看Pango中對OpenType字體的操作源文件實現(xiàn),可知字形與Feature進行 配對時,使用字形的屬性信息與Feature的屬性信息進行按位與非運算。有些Feature需 要作用于所有的Glyph,有些Feature只需要作用于某些Glyph。如圖7的OpenType字體 庫的init Feature只是作用于編碼從U1820到U1842的部分名義字符;而calt Feature 幾乎需要作用于字體庫中所有的字形。本選形引擎可定義各個Feature屬性信息如下表lGSub表中Feature的定義和取值PangoOTFeatureM即Property_bit 替換禾中類
PANGO—OT——TAG——薩E( 'i,, , n,,,init(值取詞首i,,, t,)0x0001)PANGO—OT——TAG——薩E( 'm,, , e,,,medi (值取詞中d,,' i,)0x0002)PANGO—OT——TAG——薩E( 'f,, , i,,,fina(值取詞尾n, , , a,)0x0004)PANGO—OT——TAG——薩E( 'i,, , s,,,isol(值取獨立體。,,,1,)0x0008)PANGO—OT——TAG——薩E( 'r,, , 1,,,OxFFFF連字替換i,,, g,)PANGO—OT——TAG——薩E( 'c,, , a,,,OxFFFF上下文替換IV t,)在替換過程中字形的屬性信息要與需要使用的Feature的屬性信息作,我們可以定義幾個常量ginit, gmedi, gisol, gfina做為字形的屬性信息,ginit可取 medi,fina, isol的或,gmedi可取剩余三個即init, isol, f ina的或。其余情況相同,在此 就不一一列舉。需要說明的是Feature屬性是calt與rlig的屬性值選為OxFFFF,無論與 ginit, gmedi, gisol, gfina中的任何一個進行匹配時結(jié)果后四位都不是全零,可知屬性值 是calt與rlig的feature使用于所有的字形。這是符合我們設計需要的,即規(guī)則的定義 便于后續(xù)的替換,從而實現(xiàn)變形(選形)顯示。
2)其中,混合文本的預處理(圖11): —段文本可能是蒙古文、漢文、英文及其他語言的組合文本,因為前文提到的我們 蒙古文OpenType字體中的Language Scripts (語言標記)最好設置為默認值,所以,我們 需要對文本中的字符進行判斷,對非蒙古文字符刻意的放棄處理,防止其他文種的字符丟 失。本選形系統(tǒng)可以根據(jù)蒙古文的Unicode編碼區(qū)間(U1820-U1842、U180B-U180E、U200C、 U200D、U202F)來區(qū)分是否是蒙古文字符,若是蒙古文字符則進行相應的處理(蒙古文—— 處理模塊注冊名將蒙古文處理模塊注冊到Pango庫,正確的蒙古文顯示),否則放棄處理, 交給Pango庫處理。剩下的蒙古文字符文本會被切割為若干個小片段。
3)按"字形簇"為單位劃分蒙古文文本,參見圖12。 在文字排版中,與文字流相關(guān)的單位依次為文章、段、行、字。多文種混排與單一 文種排版在文章、段、行、的處理上沒有太大的差別,主要差別在于字在行中的表現(xiàn)行為。這 里的"字"是指文字流的基本單元,在Unicode中,用戶默認的文字處理單元的概念不是字符,而是由一個或多個字符組成的"字形簇"(grapheme cluster)。 構(gòu)成同一個字形簇中的字符必須同時參與選形和置位,如蒙古文中控制符和被控 字符必須作為一個整體同時參與選形和置位。將文本劃分字形簇需要考慮到文本所在語系 的一些特征,不同語系的文本劃分字形簇的方法也不同,下面詳細介紹了蒙古文文本的字
形簇劃分方法。
將蒙古文文本以字形簇為單位進行劃分,如可以按下述方法劃分元音+輔音+控制字符;輔音+元音+控制字符;輔音+元音;輔音+控制字符;元音+輔音;元音+控制字符;控制字符+元音;或者,單個的元音字符或輔音字符。其中元音、輔音、控制字符可以通過各自的Unicode編碼枚舉分類。同時,字形簇
的劃分中可能會出現(xiàn)歧義問題,本選形系統(tǒng)采用最大匹配法結(jié)合將控制字符分類的方法進 行消除歧義。蒙古文的七個控制字符的作用,有的是使其前面的字符發(fā)生變形,有的是使其 后面的字符發(fā)生變形,有的是前面后面的字符都可能引起變形??梢詫⑦@些控制字符分稱 三類,利用其含義消除歧義。若歧義是由第一種控制字符引起的,可偏向于將控制字符向前
劃分;若歧義是由第二種控制字符引起的,則偏向與向后劃分;第三種控制字符引起的歧 義問題,考慮到第三種控制字符的作用通常是上下文替換,可以將其偏向向前劃分,在之后 的訪問GSUB表的Feature時可以自動的消除歧義,即如果字體中定義了關(guān)于該字符的上下 文替換的規(guī)則,則利用Lookup進行替換,否則原本就不是歧義問題。圖11中,180E、202F為 控制碼(即對應著控制字符),其他為輔音、元音,將這些輔音、元音、控制字符按照相應的 規(guī)定劃分成字形簇即1、2、3.......7。 將蒙古文文本小片段劃分為若干個字符簇,下面就可以按字形簇為單位進行處理。 4)蒙古文字符串自動選形系統(tǒng)的實現(xiàn),參見圖12。 上面的文本預處理操作得到的結(jié)果是若干個蒙古文小片段,選形系統(tǒng)依次處理每 一個片段,在處理每個片段時是按字形簇為單位處理的。具體的處理過程如下 首先,將構(gòu)成一個字形簇(如劃分的1、2.......或7)的字符串通過訪問
OpenType字體得到對應的字形索引串。具體實現(xiàn)是依次選擇字符串中的字符,通過編碼 訪問0penType字體得到該字符在字體中的索引號,再將這些得到的索引號連接得到的索 引序列成為字形索引串。在不引起歧義的情況下,我們將字形索引串簡稱為字形串,將字形 簇簡稱為簇。 接著分析該簇為字形串貼上特征標簽(首、尾、中、獨),用來標記使用哪些 0penType中的Lookup進行替換(即正確對應的lookup)。由于蒙古文中的控制字符的含 義不同,為字形串貼標簽也變得比較復雜。如果是簡單的將字形串的第一個字形貼上init 標簽,最后一個貼上fina標簽,其余統(tǒng)統(tǒng)貼medi標簽,經(jīng)實驗證明是無法完成蒙古文的正確顯示的。所以需綜合考慮簇的組成部分、簇與蒙古文片段中的位置關(guān)系以及前后的一些 特殊的控制符對其的影響。 T對于長度為一的簇來說,會有四種可能需考慮。 參第一種可能,當前字符是控制字符,或者該簇就是一個片段,或者該簇后面接 的是U200C(零寬度禁連符)并且該字符是片段中的第一個字符,此時需要為該字形貼上 gisol標簽。 參第二種可能,當前字符是片段中的最后一個字符、后面接的字符是U180E或
U202F、或者后接字符是U200C且當前字符不是本片段中的第一個字符,此時需要給該字形 貼上gfina標簽。參第三種可能,當前字符是第一個字符、當前字符不是第一個字符但是前面字符
是U200C(零寬度禁連符),此時需要給該字形貼上ginit標簽。 參第四種可能,都是一些普通的情況,直接貼gmedi標簽即可。 V長度為二的簇是最復雜的一種情況,因為構(gòu)成長度為二的簇有很多種情況,如
輔音+元音、輔音+控制字符、元音+輔音、元音+控制字符、控制字符+元音。本選形系
統(tǒng)對長度為二的簇的分析是先分類,分成內(nèi)部有控制字符和內(nèi)部無控制字符兩類。對于內(nèi)
部無控制字符的簇處理起來相對簡單,只需要考慮簇在片段中的位置和簇前后的一些控制
符。具體貼標簽方法如下 參字形簇中沒有控制字符的情況 如果該簇本身就是一個片段,也就是說這個片段只有兩個蒙古文字符。此時前后 一定是沒有控制字符的,這種情況只需為第一個字形貼ginit標簽,第二個字形貼gfina標 簽。 否則該簇是片段中的一部分,接著就分析該簇在片段中的位置信息。如果該簇是 片段的開始部分,此時為該簇的第一個字形貼ginit標簽,第二個字形貼gmedi標簽;如果 該簇是片段的結(jié)尾部分,則為第一個字形貼gmedi標簽,第二個字形貼gfina標簽;剩余的 情況就是該簇是片段中的中間部分,對于這種情況只需要為第一個字形和第二個字形都貼 gmedi標簽。 參字形簇中有控制字符的情況 內(nèi)部有控制字符的簇處理起來相對復雜一些。如果本簇就是一個片段,由于有一 個控制字符,所以貼標簽的時候可以將第一個和第二個字形都貼上gisol標簽;如果本簇 是片段的開始部分則將控制字符貼gisol標簽,另一個字形貼ginit標簽;如果本簇是片段 的結(jié)尾部分,則為控制字符貼gisol標簽,另一個字形貼gf ina標簽;另一種情況就是簇在 片段的中間,此時為控制字符貼gisol標簽,為另一字形貼gmedi標簽。
T長度為三的簇可能由元音+輔音+控制字符或者輔音+元音+控制字符構(gòu)成。
如果該簇是片段的開始部分,則第一個字形貼ginit標簽,否則需貼gmedi標 簽。第二個字形貼標簽時需要考慮后面控制字符的影響,如果本簇后面接的是U180E或 者U202F控制字符,此時需將第二個字形貼gf ina標簽;此時需要注意蒙古文字符的一些 特殊編碼情況,Unicode基本上都是為蒙古文字符的獨立體形式編碼,只有兩個是特殊的, U1824和U1826是詞首形式編碼。如果第二個字符是U1824或U1826,則需要為第二個字形 貼ginit標簽。第三個字符因為是控制字符,則直接貼gisol標簽即可。
通過上述的貼標簽過程,得到的結(jié)果是一個貼有標簽信息的字形串緩沖。接下來
就是訪問0penType字體中的GSUB表進行選形。選形替換過程大致如下 先讀入OpenType中的Feature的數(shù)目,進行循環(huán),將隸屬于各個Feature的
Lookup的表頭鏈接加到一個HB_GSUB數(shù)據(jù)結(jié)構(gòu)鏈表上,這樣就裝載了所有的Feature以便
于后面的使用。 接著將這些貼有標簽信息的字符串緩沖進行處理,處理也是一個循環(huán)的過程,循環(huán)次數(shù)是字體中的Feature數(shù)目,這樣保證了所有的Lookup都有機會參與替換。用到的具體替換分為單字形替換、多字形替換和上下文替換。首先進行的是單字形替換,根據(jù)上述貼的ginit、 gmedi、 gfina和gisol進行替換。再將得到的結(jié)果進行多字形替換,這里的多字形替換指的是上文提到的連體替換,上文提到rlig特征的取值是OxFFFF,則之前的字形串緩沖中的特征信息與rlig特征是不沖突的,只要是滿足lookup中的替換條件就可以??梢娙我獾淖中未彌_都有機會去標記是rlig的Feature中使用Lookup的。最后進行的替換是上下文替換,前文提到calt特征的取值是OxFFFF,標記是calt的Feature的使用范圍類似與標記是rlig的Feature,是對前面兩次替換的最終替換,結(jié)果是最終要顯示的目標字形串。由此,通過利用OpenType字體中的規(guī)則驚進行的選形替換得到最后正確的顯示結(jié)果(如12)。 具有上述接口和顯示能力的蒙古文處理模塊也很容易通過該接口和模塊化的形式移植到WINDOWS系統(tǒng)實現(xiàn)跨平臺顯示。
基于顯示而改進的智能輸入方法
LINUX系統(tǒng)下已有的輸入法協(xié)議 目前在Li皿x平臺上,存在很多種輸入法。在臺灣的繁體中文平臺上,流行的是xcin ;在大陸的簡體中文平臺上有最初的chinput,紅旗的rf input,小企鵝輸入法fcitx,這些輸入法是基于XIM協(xié)議實現(xiàn)的(X Input Method是X-Window系統(tǒng)下的符合國際化標準的輸入法協(xié)議)。不同于XM協(xié)議實現(xiàn)的輸入法框架,有新近出現(xiàn)的SCIM(Smart CommonInput Method platform支持多國語言的輸入法平臺)禾口 IIMF (Internet/Intranet InputMethod Framework互聯(lián)網(wǎng)/內(nèi)聯(lián)網(wǎng)輸入法框架,多語言輸入法平臺)輸入法協(xié)議,GN0ME的GTK頂Module (GTK輸入法模塊)等。 本發(fā)明的智能輸入方法是基于SCIM協(xié)議。SCM, SCIM通過前端和不同的客戶程序交互,在后端實現(xiàn)ME輸入法編輯器的管理,其具有
1)對UNICODE提供全面支持。
2)高度模塊化。 3)支持動態(tài)加載不同的輸入法引擎,支持C/S模式運行。 LINUX系統(tǒng)下的SCIM協(xié)議類似于Windows系統(tǒng)下的MM(輸入法管理器),不同的輸入法引擎都由SCIM統(tǒng)一管理。在安裝新的輸入法引擎和卸載輸入法引擎時都十分的方便和簡單,也可以選擇啟用哪些輸入法引擎而不用去卸載它。 蒙古文的處理是基于Unicode編碼的,故在編碼方面SCIM處理蒙古文是可行的。不同的輸入法引擎是獨立于通用的SCIM協(xié)議而工作,不同的輸入法引擎可以實現(xiàn)SCIM框架為輸入法引擎模塊提供的接口,并編譯成動態(tài)鏈接庫。由框架動態(tài)的調(diào)用進行工作。
盡管SCIM有著上述諸多優(yōu)點,但在蒙古文智能輸入法開發(fā)過程中仍存在許多技
1714/16頁
術(shù)難題,這其中面臨的最大問題是候選詞窗口中的蒙古文的豎向顯示,因為SCIM提供的輸入法Panel模塊(控制板模塊)不支持蒙古文的變形顯示也不支持豎向顯示。本發(fā)明是通過不使用SCIM本身的Panel模塊,采用外掛式的Panel的方式,從蒙古文處理系統(tǒng)引擎的內(nèi)部實現(xiàn)了一個Panel,對其他輸入法引擎以及SCIM框架本身不會有任何的影響。而對蒙古文的繪制問題可以采用一定的渲染引擎進行繪制,本輸入法引擎選用的是xft渲染引擎。 LINUX系統(tǒng)下的蒙古文智能輸入法("蒙文之星"Mstar)
( — )輸入法引擎的接口 使用SCIM開發(fā)一個新的智能輸入法引擎,需要派生出MEngineFactoryBase和IMEnginelnstanceBa se兩個類的子類。本智能輸入法派生出來的類是MStarFactory和MStarInstance。 MStarFactory負責管理本智能輸入法的ID號、名字和所在語系信息。MStarlnstance負責引擎的具體處理過程,它是一個對輸入法上下文的封裝的類。每建立一個本智能輸入法的上下文(在應用程序中激活本輸入法)就會由MStarFactory創(chuàng)建一個新的MStarlnstance對象。關(guān)閉上下文時調(diào)用MStarlnstance析構(gòu)函數(shù)銷毀對象。
MStarlnstance需要重寫IMEnginelnstanceBase類中的 一些關(guān)鍵的虛函數(shù)。如 virtual bool process_key_event(const KeyEvent&key) 禾口 virtual void send—string(Wchar_t*Str)。前一個函數(shù)用于處理接收到的按鍵信息,比如,每一次按鍵都會觸發(fā)這個函數(shù),它的參數(shù)是按鍵碼,可以根據(jù)按鍵碼決定怎么處理這次按鍵事件,若不希望輸入法處理則直接返回false,將剛才的按鍵事件發(fā)送給應用程序,否則調(diào)用相應的處理程序,這個函數(shù)是輸入法引擎轉(zhuǎn)化按鍵序列到目標結(jié)果串編碼序列的入口。后一個函數(shù)的作用是提交結(jié)果串給應用程序,完成一次錄入。[OWO] ( 二 )輸入法引擎對按鍵的處理 基本上所有的輸入法都會定義一些特殊的鍵或組合鍵來完成特定的功能,人們稱之為熱鍵。例如,在拼音輸入法中的中英文切換、全/半角切換等功能往往可以用鼠標點擊來實現(xiàn),也可以用定義的一些熱鍵來進行切換。 輸入法引擎并不是要處理所有的按鍵信息,是有選擇的捕獲一些按鍵進行處理,剩余的按鍵信息交給應用程序或者輸入法框架去處理。本智能輸入法只捕獲兩類按鍵信息, 一類是定義的熱鍵信息,另一類是符合蒙古文鍵盤布局的按鍵信息。在本輸入法引擎中定義了符合用戶習慣的一些熱鍵,如Shift+Space全/半角切換,Control+Space輸入法引擎開啟/關(guān)閉切換等。在鍵盤布局方面,本智能輸入法使用的是確精扎布先生的著作《蒙古文編碼》中定義的蒙古文通用鍵盤布局。本智能輸入法工作流程大致如下
1.將接收到的按鍵信息進行判斷,如果按鍵信息既不是熱鍵也不是鍵盤布局中涉及的按鍵,則放棄處理,否則進行下面的處理。 2.按鍵信息是定義的某一熱鍵,則改變一些相應的標記變量,并做出一定的變化動作。如有一個標記變量用來標記當前輸入法狀態(tài)是全角還是半角,當前的按鍵正好是定義的全/半角切換功能熱鍵,此時需要改變該變量的值,并且將面板上的圖標進行更改,在全角和半角的圖標之間進行切換。另外的一些熱鍵如蒙文/英文的切換等工作原理類似,在次就不在一一例舉。 3.按鍵信息不是熱鍵,是要處理的字符按鍵。這類按鍵可以分為兩類,一類是字符按鍵,如'a',' z'等,另一類是一些特殊的按鍵,如回車符、空格、退格符、刪除符、光標的左右按鍵、Home、 End、數(shù)字鍵等特殊按鍵。
1)字符按鍵的處理 字符按鍵可以插入在一個數(shù)組中,該數(shù)組用來記錄當前的按鍵序列,同時還需配有一個游標指向數(shù)組中的當前字符位置。每接收到一個字符按鍵事件,將這個按鍵的編碼插到數(shù)組的游標位置之后,并依次將數(shù)組中的每個字符通過訪問鍵盤布局文件得到的蒙古文編碼插入到另一個數(shù)組中。這個數(shù)組用來記錄對應的蒙文串,同時還需要配有一個游標,標注當前的插入位置。兩個游標保持相對同步,可能是移動的步長不一,但在各自內(nèi)部的相對位置是始終保持一致的。 2)對于一些特殊的按鍵,需要相應的處理 回車符的處理,本智能輸入法是將保存得到的英文按鍵串提交給應用程序,同時將保存英文字符和蒙文字符的兩個數(shù)組都清空,兩個游標都復位成指向數(shù)組的起始位置,并且使預編輯窗口和狀態(tài)窗口內(nèi)容擦除并隱藏。 空格符的處理,是將候選詞組中的第一個候選詞提交給應用程序,同時完成與回車符相同的一些清空、復位以及隱藏窗口操作。 退格符和刪除符的處理,將英文按鍵串和蒙古文串都向前或向后刪除一個單元。
如果刪除出界,可以給用戶發(fā)出一個聲音提示,并且不做任何處理,防止內(nèi)存越界。 光標的左右按鍵、Home、 End的處理,此類按鍵不會影響保存的按鍵編碼串和蒙文
串,只是改變了兩個數(shù)組中的游標位置;Home鍵的處理是將兩個游標都復位成數(shù)組的開始
位置,End鍵的處理是將兩個游標都置成串的最后一個位置;光標的左右按鍵是將游標先
前或向后移動一個單位,在發(fā)生移動越界的時候,可以給用戶發(fā)出一個聲音提示,不做任何處理。 數(shù)字鍵的處理,第一種情況,按鍵序列不空時,數(shù)字鍵用于選擇候選詞,此時,通過敲擊提示數(shù)字鍵,選擇相應的候選詞提交給應用程序。另一種情況,按鍵序列為空時,利用單個數(shù)字鍵敲擊出一些常用的詞。需要說明的是,此時,候選詞可能又會有好幾個,一旦發(fā)現(xiàn)按鍵序列不空,數(shù)字鍵又恢復了選擇功能。 由此,不需要錄入員額外的培訓及記憶,使該智能輸入法使用更為簡單,方便了用戶的使用,提高了錄入速度。也實現(xiàn)了蒙古文輸入過程中的詞匯記憶和交互功能。[oaos](三)候選詞的生成 由于蒙古文控制字符的存在,使得候選詞的生成不是簡單的蒙古文字符的拼接,也就是說蒙文串并不一定是需要的目標結(jié)果串。絕大多數(shù)用戶根本就沒有控制字符的概念,為了方便于用戶的使用,本智能輸入法需要自動的添加控制字符,使用戶感覺不到有控制字符的存在。但控制字符的添加是很難總結(jié)出規(guī)律的,所以本研究選用了統(tǒng)計與規(guī)則相結(jié)合的辦法來產(chǎn)生候選詞。總的來說候選詞的生成是分為兩部分。 第一部分是基于統(tǒng)計的,內(nèi)蒙古師范大學的嘎日迪教授為本研究提供了大量的蒙古文Unicode語料,通過對語料的處理及一系列操作,整理出了一張蒙古文碼表。在輸入過程中可以通過按鍵編碼串查找碼表得到若干個候選詞。 第二部分是基于規(guī)則的,通過對蒙古文0penType字體中規(guī)則的查看以及蒙古語專家的總結(jié),大體總結(jié)了一些控制字符添加的規(guī)則。這部分候選詞的生成是將蒙文串按照
19這些總結(jié)出來的規(guī)則自動的添加得到的。如按鍵序列根據(jù)蒙古文鍵盤布局得到對應蒙古文 字符串(1個)、再根據(jù)添加規(guī)則添加得到若干結(jié)果。 最后將這兩部分結(jié)果進行組合,同時刪去多余的相同的候選詞,作為本次輸入的 最終候選詞結(jié)果(并集)。從而也就實現(xiàn)了在輸入過程中對蒙古文Unicode控制字符的自 動添加。 如,根據(jù)確精扎布先生的《蒙古文編碼》上控制字符的含義和傳統(tǒng)蒙古文構(gòu)詞特點 整理出一些規(guī)則,依靠這些規(guī)則自動添加控制字符^在詞尾有時候需要顯示成^/而有時候 卻要加上控制字符,讓其顯示為〗,則可以針對這個情況增加一條規(guī)則插入180E控制字符。 圖13示意了一種規(guī)則管理的情況(詞尾規(guī)則的情況),將規(guī)則分為四塊(詞首、詞中、詞尾、 獨立體)。(四)候選窗口的處理(控制字符的選擇輸入) 由于SCIM提供的Panel部分不支持蒙古文的顯示,本智能輸入法放棄SCIM提供 的Panel,新產(chǎn)生一個候選詞窗口 ,將蒙古文候選詞顯示出來。 首先,需要將候選詞文本串都轉(zhuǎn)換為字形串(依據(jù)之前描述的蒙古文顯示方法)。 接著,就需要將這些字形串進行豎向旋轉(zhuǎn)并顯示,本輸入法引擎使用的是Pango庫的數(shù)據(jù) 結(jié)構(gòu),如PangoMatrix,對這個數(shù)據(jù)結(jié)構(gòu)進行270度旋轉(zhuǎn)使其變成豎向排版。為了避免顯示 出現(xiàn)閃屏現(xiàn)象,本智能輸入法采用在內(nèi)存中預輸出的方法,同時計算預期窗口大小尺寸。每 一次按鍵事件都可能進行一次候選詞的生成,為顯示尺寸與窗口尺寸規(guī)定一個閾值,當顯 示尺寸比原先窗口尺寸大于這個閾值時,擴大窗口尺寸。當顯示尺寸比原先窗口尺寸小于 這個閾值時,縮小窗口尺寸。這種動態(tài)變化的界面,會顯得比較協(xié)調(diào),給用戶帶來友好的感 覺。 最后,使用Xft渲染引擎將其輸出,當然在輸出的時候需要記錄并計算一些位置 信息,通過這些信息最終用pango_xft_render_transformed函數(shù)將其輸出到相應的位置。
本發(fā)明的蒙古文Unicode拼音智能輸入法能在GNOME系統(tǒng)下穩(wěn)定工作,若更換 復雜文本引擎可以很方便的將本智能輸入法移植到其他系統(tǒng)上,如能移植到Window XP/ Vista下,從而也就解決了 WindowsVista環(huán)境下用戶只能通過自己輸入Unicode控制字符 來實現(xiàn)蒙古文名義字符轉(zhuǎn)換為變形顯現(xiàn)字符的問題,實現(xiàn)了在輸入過程中的控制字符的自 動添加。圖1、圖2、圖3為其工作測試畫面。由此,實現(xiàn)了蒙古文跨操作系統(tǒng)平臺的輸入和 顯示,且不同的輸入法之間不發(fā)生沖突(由于Unicode和外掛模塊)。注ME輸入法引擎; socket server套接字服務器;Xll frontend為XI1前端;X A卯為X應用程序;GTKA卯為 GTK應用程序;GTK I匪odule為GTK輸入法模塊;Panel為控制板
顯而易見,在此描述的本發(fā)明可以有許多變化,這種變化不能認為偏離本發(fā)明的 精神和范圍。因此,所有對本領(lǐng)域技術(shù)人員顯而易見的改變,都包括在本權(quán)利要求書的涵蓋 范圍之內(nèi)。
權(quán)利要求
一種顯示蒙古文的方法,在Linux系統(tǒng)GNOME桌面系統(tǒng)平臺上實現(xiàn)蒙古文的正確顯示,其特征在于,該方法包括在GNOME桌面系統(tǒng)的處理文字語言的Pango系統(tǒng)中,建立蒙古文處理系統(tǒng)引擎;向?qū)嵤┪淖终Z言處理的Pango系統(tǒng)注冊蒙古文處理系統(tǒng)引擎名,形成蒙古文處理系統(tǒng)引擎與操作系統(tǒng)的文字語言處理系統(tǒng)之間的接口;在蒙古文處理系統(tǒng)引擎中生成蒙古文處理模塊,所述蒙古文處理模塊基于預定的對應OpenType蒙古文字體的規(guī)則和結(jié)構(gòu),生成選形引擎對OpenType的蒙古文字體進行選形替換,經(jīng)過選形替換后獲得正確的蒙古文顯示結(jié)果。
2. 如權(quán)利要求1所述的方法,進一步包括所述Linux系統(tǒng)GNOME桌面系統(tǒng)平臺遵循 Unicode國際標準;對存在蒙古文的混合文本顯示的預處理,是通過Unicode編碼來區(qū)分文 本中要顯示的字符是否為蒙古文字符,如果是則進入蒙古文處理系統(tǒng)引擎,如果不是則不 需要進入。
3. 如權(quán)利要求1所述的方法,其中,選形引擎對OpenType的蒙古文字體進行選形替換 包括先對需要顯示處理的蒙古文文本按字形簇為單位進行分簇;接著,以字形簇為單位進行處理基于預定的對應OpenType蒙古文字體的規(guī)則和結(jié) 構(gòu),為劃分出的各字形簇找出對應的字形索引串并貼標簽,依據(jù)貼標簽后形成貼有標簽信 息的字形串緩沖訪問OpenType字體中的GSUB表,對應標簽信息,進行字體循環(huán)選形替換, 最后將替換得到的最終目標字形串作為顯示用所需要的結(jié)果。
4. 如權(quán)利要求3所述的方法,其中,基于預定的對應OpenType蒙古文字體的規(guī)則和 結(jié)構(gòu)包括定義了上下文替換、詞首替換、獨立體替換、詞中替換、連體替換、詞尾替換六個 Feature特征,以將OpenType蒙古文字體中的字形替換規(guī)則分類管理,各字形替換規(guī)則放 入GSUB表的Lookup替換中, 一個Lookup對應一條替換規(guī)則,并歸屬于相對應的Feature ;其中,每個Lookupt替換定義為若干個字形串轉(zhuǎn)換為若干個字形串的形式、或一個字 形轉(zhuǎn)換為一個字形、或多個字形串轉(zhuǎn)換為一個字形、或幾個字形轉(zhuǎn)換為另外幾個字形;其中,字形簇的劃分即分簇方式為元音+輔音+控制字符、輔音+元音+控制字符、輔 音+元音、輔音+控制字符、元音+輔音、元音+控制字符、控制字符+元音、單個的元音字 符或輔音字符,根據(jù)Unicode編碼枚舉分類出哪些是元音、哪些是輔音、哪些是控制字符。
5. 如權(quán)利要求1 4之一所述的方法,進一步包括在蒙古文處理系統(tǒng)引擎中建立輸入法Panel模塊,輸入法Panel模塊其采用xft渲染 引擎繪制蒙古文而形成蒙古文輸入法引擎,所述蒙古文輸入法引擎與SCIM輸入法平臺之間建立接口,將所述蒙古文輸入法引擎 添加到SCIM輸入法平臺并由其統(tǒng)一調(diào)用和管理;其中,所述的蒙古文輸入法引擎與SCIM輸入法平臺之間建立的接口由SCIM輸入法平 臺生成;其中,當所述的蒙古文輸入法引擎對按鍵處理時,有選擇的捕獲按鍵信息處理,其余按 鍵信息由SCIM輸入法平臺處理,選擇捕獲的按鍵信息是定義的熱鍵信息以及符合蒙古文 鍵盤布局的按鍵信息。
6. 如權(quán)利要求5所述的方法,其中,蒙古文輸入法引擎利用對蒙古文Unicode語料統(tǒng)計得到的蒙古文碼表的查找結(jié)果、利用對蒙古文OpenType字體的控制字符添加的規(guī)律分析 所得到的添加控制字符的規(guī)則而添加得到的結(jié)果,合并兩個結(jié)果得到蒙古文Unicode控制 字符的候選詞;其中,所述蒙古文處理系統(tǒng)引擎中建立的輸入法Panel模塊,產(chǎn)生一個候選詞窗口顯 示蒙古文候選詞。
7. 如權(quán)利要求6所述的方法,其中,產(chǎn)生顯示蒙古文的所述候選詞窗口包括 根據(jù)所述顯示蒙古文的方法將候選詞文本串轉(zhuǎn)換成字形串;所述的蒙古文輸入法引擎使用Pango系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)將要顯示的字形串進行270度旋 轉(zhuǎn)成為豎向排版,并采用在內(nèi)存中預輸出的方式防止閃屏,計算預期窗口大小尺寸;使用xft渲染引擎將候選詞輸出,記錄和計算位置信息以正確輸出候選詞到相應的位置。
8. —種改進的顯示蒙古文的方法,其在Windows系統(tǒng)實現(xiàn)蒙古文的正確顯示,其特征 在于,該方法包括在Windows系統(tǒng)處理文字語言的系統(tǒng)中建立蒙古文處理系統(tǒng)引擎;向?qū)嵤┪淖终Z言處理的系統(tǒng)注冊蒙古文處理系統(tǒng)引擎名,形成蒙古文處理系統(tǒng)引擎與 操作系統(tǒng)的文字語言處理系統(tǒng)之間的接口;在蒙古文處理系統(tǒng)引擎中生成蒙古文處理模塊,所述蒙古文處理模塊基于預定的對應 OpenType蒙古文字體的規(guī)則和結(jié)構(gòu),生成選形引擎對OpenType的蒙古文字體進行選形替 換,經(jīng)過選形替換后獲得正確的蒙古文顯示結(jié)果。
9. 如權(quán)利要求8所述的方法,進一步包括在蒙古文處理系統(tǒng)引擎中建立輸入法Panel模塊,輸入法Panel模塊其采用xft渲染 引擎繪制蒙古文而形成蒙古文輸入法引擎;所述蒙古文輸入法引擎與SCIM輸入法平臺之間建立接口,將所述蒙古文輸入法引擎 添加到SCIM輸入法平臺并由其統(tǒng)一調(diào)用和管理;其中,所述的蒙古文輸入法引擎與SCIM輸入法平臺之間建立的接口由SCIM輸入法平 臺生成;其中,當所述的蒙古文輸入法引擎對按鍵處理時,有選擇的捕獲按鍵信息處理,其余按 鍵信息由SCIM輸入法平臺處理,選擇捕獲的按鍵信息是定義的熱鍵信息以及符合蒙古文 鍵盤布局的按鍵信息;其中,蒙古文輸入法引擎利用對蒙古文Unicode語料統(tǒng)計得到的蒙古文碼表的查找結(jié) 果、利用對蒙古文OpenType字體的控制字符添加的規(guī)律分析所得到的添加控制字符的規(guī) 則而添加得到的結(jié)果,合并兩個結(jié)果得到蒙古文Unicode控制字符的候選詞;其中,所述蒙古文處理系統(tǒng)引擎中建立的輸入法Panel模塊,產(chǎn)生一個候選詞窗口顯 示蒙古文候選詞。
10. 如權(quán)利要求9所述的方法,其中,產(chǎn)生顯示蒙古文的所述候選詞窗口包括 根據(jù)所述顯示蒙古文的方法將候選詞文本串轉(zhuǎn)換成字形串;所述的蒙古文輸入法引擎使用Windows的XP/Vista系統(tǒng)下的數(shù)據(jù)結(jié)構(gòu)將要顯示的字 形串進行270度旋轉(zhuǎn)成為豎向排版,并采用在內(nèi)存中預輸出的方式防止閃屏,計算預期窗 口大小尺寸;使用xft渲染引擎將候選詞輸出,記錄和計算位置信息以正確輸出候選詞到相應的位置。
全文摘要
本發(fā)明專利申請涉及在LINUX系統(tǒng)的GNOME桌面系統(tǒng)平臺上顯示蒙古文的方法,其在GNOME桌面系統(tǒng)的處理文字語言的Pango系統(tǒng)中建立蒙古文處理系統(tǒng)引擎,向?qū)嵤┪淖终Z言處理的Pango系統(tǒng)注冊蒙古文處理系統(tǒng)引擎名,形成蒙古文處理系統(tǒng)引擎與操作系統(tǒng)的文字語言處理系統(tǒng)之間的接口,并在蒙古文處理系統(tǒng)引擎中生成蒙古文處理模塊,所述蒙古文處理模塊基于OpenType字體的規(guī)則和結(jié)構(gòu),構(gòu)造選形引擎以對OpenType的蒙古文字體進行選形替換,經(jīng)過選形替換后獲得正確的蒙古文顯示結(jié)果。本方法實現(xiàn)了在Linux操作系統(tǒng)上基于Unicode編碼的蒙古文顯示及其智能輸入,并且該蒙古文顯示方法及其智能輸入法可以與漢語及其它已裝載語言輸入法同時使用而不影響其原有功能和應用。
文檔編號G06F17/22GK101694603SQ200910235600
公開日2010年4月14日 申請日期2009年10月20日 優(yōu)先權(quán)日2009年10月20日
發(fā)明者孫媛, 李葉青, 李鋼, 王志娟, 田寄遠, 趙小兵, 閆曉東 申請人:中央民族大學;