基于Unicode的跨平台蒙古文显示及智能输入方法转让专利

申请号 : CN200910235600.5

文献号 : CN101694603B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 赵小兵田寄远孙媛闫晓东王志娟李叶青李钢

申请人 : 中央民族大学

摘要 :

本发明专利申请涉及在LINUX系统的GNOME桌面系统平台上显示蒙古文的方法,其在GNOME桌面系统的处理文字语言的Pango系统中建立蒙古文处理系统引擎,向实施文字语言处理的Pango系统注册蒙古文处理系统引擎名,形成蒙古文处理系统引擎与操作系统的文字语言处理系统之间的接口,并在蒙古文处理系统引擎中生成蒙古文处理模块,所述蒙古文处理模块基于OpenType字体的规则和结构,构造选形引擎以对OpenType的蒙古文字体进行选形替换,经过选形替换后获得正确的蒙古文显示结果。本方法实现了在Linux操作系统上基于Unicode编码的蒙古文显示及其智能输入,并且该蒙古文显示方法及其智能输入法可以与汉语及其它已装载语言输入法同时使用而不影响其原有功能和应用。

权利要求 :

1.一种显示蒙古文的方法,在Linux系统GNOME桌面系统平台上实现蒙古文的正确显示,其特征在于,该方法包括:在GNOME桌面系统的处理文字语言的Pango系统中,建立蒙古文处理系统引擎;

向实施文字语言处理的Pango系统注册蒙古文处理系统引擎名,形成蒙古文处理系统引擎与操作系统的文字语言处理系统之间的接口;

在所述蒙古文处理系统引擎中建立输入法面板模块(Panel模块),该输入法面板模块(Panel模块)采用xft渲染引擎绘制蒙古文而形成蒙古文输入法引擎;

所述蒙古文输入法引擎与SCIM输入法平台之间建立接口,将所述蒙古文输入法引擎添加到SCIM输入法平台并由其统一调用和管理;

在蒙古文处理系统引擎中生成蒙古文处理模块,所述蒙古文处理模块基于预定的对应OpenType蒙古文字体的规则和结构,生成选形引擎对OpenType的蒙古文字体进行选形替换,经过选形替换后获得正确的蒙古文显示结果。

2.如权利要求1所述的方法,进一步包括:所述Linux系统GNOME桌面系统平台遵循Unicode国际标准;对存在蒙古文的混合文本显示的预处理,是通过Unicode编码来区分文本中要显示的字符是否为蒙古文字符,如果是则进入蒙古文处理系统引擎,如果不是则不需要进入。

3.如权利要求1所述的方法,其中,选形引擎对OpenType的蒙古文字体进行选形替换包括:先对需要显示处理的蒙古文文本按字形簇为单位进行分簇;

接着,以字形簇为单位进行处理:基于预定的对应OpenType蒙古文字体的规则和结构,为划分出的各字形簇找出对应的字形索引串并贴标签,依据贴标签后形成贴有标签信息的字形串缓冲访问OpenType字体中的字形替换表(GSUB表),对应标签信息,进行字体循环选形替换,最后将替换得到的最终目标字形串作为显示用所需要的结果。

4.如权利要求3所述的方法,其中,基于预定的对应OpenType蒙古文字体的规则和结构包括:定义了上下文替换、词首替换、独立体替换、词中替换、连体替换、词尾替换六个标签(Feature),以将OpenType蒙古文字体中的字形替换规则分类管理,各字形替换规则放入字形替换表(GSUB表)的查找项(Lookup)中,一个查找项(Lookup)对应一条替换规则,并归属于相对应的标签(Feature);

其中,每个查找项(Lookup)替换定义:为若干个字形串转换为若干个字形串的形式、或一个字形转换为一个字形、或多个字形串转换为一个字形、或几个字形转换为另外几个字形;

其中,字形簇的划分即分簇方式为:元音+辅音+控制字符、辅音+元音+控制字符、辅音+元音、辅音+控制字符、元音+辅音、元音+控制字符、控制字符+元音、单个的元音字符或辅音字符,根据Unicode编码枚举分类出哪些是元音、哪些是辅音、哪些是控制字符。

5.如权利要求1所述的方法,其特征在于,所述蒙古文输入法引擎与SCIM输入法平台之间建立的接口由SCIM输入法平台生成;并且当所述蒙古文输入法引擎对按键处理时,有选择的捕获按键信息处理,其余按键信息由SCIM输入法平台处理,选择捕获的按键信息是定义的热键信息以及符合蒙古文键盘布局的按键信息。

6.如权利要求5所述的方法,其中,蒙古文输入法引擎利用对蒙古文Unicode语料统计得到的蒙古文码表的查找结果、利用对蒙古文OpenType字体的控制字符添加的规律分析所得到的添加控制字符的规则而添加得到的结果,合并两个结果得到蒙古文Unicode控制字符的候选词;

其中,所述蒙古文处理系统引擎中建立的输入法面板模块(Panel模块),产生一个候选词窗口显示蒙古文候选词。

7.如权利要求6所述的方法,其中,产生显示蒙古文的所述候选词窗口包括:

根据所述显示蒙古文的方法将候选词文本串转换成字形串;

所述的蒙古文输入法引擎使用Pango系统的数据结构将要显示的字形串进行270度旋转成为竖向排版,并采用在内存中预输出的方式防止闪屏,计算预期窗口大小尺寸;

使用xft渲染引擎将候选词输出,记录和计算位置信息以正确输出候选词到相应的位置。

8.一种改进的显示蒙古文的方法,其在Windows系统实现蒙古文的正确显示,其特征在于,该方法包括:在Windows系统处理文字语言的系统中建立蒙古文处理系统引擎;

向实施文字语言处理的系统注册蒙古文处理系统引擎名,形成蒙古文处理系统引擎与操作系统的文字语言处理系统之间的接口;

在所述蒙古文处理系统引擎中建立输入法面板模块(Panel模块),输入法面板模块(Panel模块)其采用xft渲染引擎绘制蒙古文而形成蒙古文输入法引擎;

所述蒙古文输入法引擎与SCIM输入法平台之间建立接口,将所述蒙古文输入法引擎添加到SCIM输入法平台并由其统一调用和管理;

在蒙古文处理系统引擎中生成蒙古文处理模块,所述蒙古文处理模块基于预定的对应OpenType蒙古文字体的规则和结构,生成选形引擎对OpenType的蒙古文字体进行选形替换,经过选形替换后获得正确的蒙古文显示结果。

9.如权利要求8所述的方法,其特征在于,

所述蒙古文输入法引擎与SCIM输入法平台之间建立的接口由SCIM输入法平台生成;

并且当所述蒙古文输入法引擎对按键处理时,有选择的捕获按键信息处理,其余按键信息由SCIM输入法平台处理,选择捕获的按键信息是定义的热键信息以及符合蒙古文键盘布局的按键信息;

并且所述蒙古文输入法引擎利用对蒙古文Unicode语料统计得到的蒙古文码表的查找结果、利用对蒙古文OpenType字体的控制字符添加的规律分析所得到的添加控制字符的规则而添加得到的结果,合并两个结果得到蒙古文Unicode控制字符的候选词;

并且所述蒙古文处理系统引擎中建立的输入法面板模块(Panel模块),产生一个候选词窗口显示蒙古文候选词。

10.如权利要求9所述的方法,其中,产生显示蒙古文的所述候选词窗口包括:

根据所述显示蒙古文的方法将候选词文本串转换成字形串;

所述的蒙古文输入法引擎使用Windows的XP/Vista系统下的数据结构将要显示的字形串进行270度旋转成为竖向排版,并采用在内存中预输出的方式防止闪屏,计算预期窗口大小尺寸;

使用xft渲染引擎将候选词输出,记录和计算位置信息以正确输出候选词到相应的位置。

说明书 :

基于Unicode的跨平台蒙古文显示及智能输入方法

技术领域

[0001] 本发明涉及跨平台蒙古文显示及相应的输入方法,尤其涉及蒙古文字在LINUX系统平台下的显示和智能输入、以及WINDOWS系统平台下的智能输入。

背景技术

[0002] 蒙古语言文字有着悠久的历史,迄今仍在使用,我国少数民族中,蒙古族人口相对较多分布也较广,尤其在我国的内蒙古自治区,蒙古语言文字有着深刻的现实运用土壤,因此随着计算机和网络在民族地区的日益普及,蒙古语言文字信息化也便日益凸现出其重要性与迫切性。蒙古语是文字形状及语法规则都比较复杂的一门语言,尤其是在信息化处理中,它有着许多技术难点,如转换规则、显示方法等。现有的蒙古文显示技术及相应的输入方法的情况如下。
[0003] Window系列产品中,XP之前的机内码主要采用两种格式,即ANSI单字节字符编码和远东字符集的双字节字符集编码。XP及最近出现的Vista的机内码都是Unicode(统一的字符编码标准,采用双字节对字符进行编码)码UTF-16,但由于蒙古文字符分配的Unicode编码名义字符与蒙古文显示实际需要的显现字形存在差异,蒙古文显示和输入仍然存在很大困难。目前,Windows系列操作系统的Vista系统从系统层支持蒙古文等几种少数民族语言文字的显示和输入,其自带的蒙古文输入法是Unicode输入法,但需要用户自行录入控制字符(输入的符号信息存在多种可能时,该控制字符用来确定输入的符号信息到底哪一种才是自己需要的),这样就需要用户去背记这些控制字符,而使得蒙古文的输入并不方便使用和普及。
[0004] 同样Linux系统的输入也存在上述缺陷。并且,Linux目前的GNOME桌面系统平台,机内码也遵循Unicode标准,具体采用UTF-8,在处理文本的显示方面,GNOME平台显示文本时使用的是Pango库,迄今为止,Pango的最高版本Pango-1.20.0仍然不能支持蒙古文的显示和输入,从而需要对其显示进行改进以支持蒙古文的显示和输入,克服上述缺陷。

发明内容

[0005] 本发明的目的是针对上述的现有技术所存在的缺陷,提供一种在LINUX系统的GNOME桌面系统平台上显示蒙古文的方法,进一步在此基础上能够改进LINUX的GNOME桌面系统和WINDOWS系统的蒙古文智能输入,在Linux的GNOME系统上实现蒙古文的显示和Unicode蒙古文拼音智能输入法,使得蒙古文能够在LINUX系统下同WINDOWS系统下一样正确显示,在此基础上,进而实现LINUX系统和WINDOWS系统下对蒙古文字符录入时控制字符的自动添加,改进现有输入法的不足。最终,实现了跨平台蒙古文显示和智能输入,填补了Linux环境的桌面系统GNOME环境下不支持蒙古文输入法的空缺,在一定程度上推动了Linux系统在民族地区的普及。
[0006] 本发明的在LINUX系统的GNOME桌面系统平台上显示蒙古文的方法,包括:在GNOME桌面系统的处理文字语言的Pango系统中,建立蒙古文处理系统引擎;其特征在于,向实施文字语言处理的Pango系统注册蒙古文处理系统引擎名,形成蒙古文处理系统引擎与操作系统的文字语言处理系统之间的接口;在蒙古文处理系统引擎中生成蒙古文处理模块,所述蒙古文处理模块基于OpenType字体的规则和结构,构造选形引擎以对OpenType的蒙古文字体进行选形替换,经过选形替换后获得正确的蒙古文显示结果。进一步的,GNOME桌面系统采用Unicode国际标准编码处理蒙古文字符,区分文本中要显示的字符是否为蒙古文字符,是则进入蒙古文处理系统引擎,否,则不需要进入,从而使得混合文本显示得以实现、使得该引擎能够跨操作系统平台接入使用;其中,先对蒙古文文本按字形簇为单位进行划分即分簇后、找到该字形簇对应的字形索引串完成贴标签的操作、再根据形成的贴有标签信息的字形串缓冲访问OpenType字体中的GSUB表进行循环的选形替换处理。进一步的,基于上述显示方法,实现控制字符的选择输入,在蒙古文处理系统引擎的蒙古文处理模块中添加输入法控制板Panel,利用xfc渲染引擎进行输入,先在SCIM框架协议下建立输入法的接口,依据Pango系统的数据结构,在内存中预输出的方式生成候选词窗口,将蒙古文候选词(包括控制字符的)显示出来,以便进行选择输入来确定最终需要输入显示的内容,从而不必用户背记各类控制字符方便了蒙古文计算机使用的普及面。其中,选形引擎根据蒙古文文字的特征,以字形簇为单位划分蒙古文文本,分析字形簇,为字形簇贴上特征标签以标记使用对应的OpenType字体中的替换规则进行替换,反复选形和替换之后获得正确的蒙古文显示结果。类似的,也可以提供在Windows系统下的显示和智能输入方法,在Windows系统处理文字语言的系统中建立蒙古文处理系统引擎;向实施文字语言处理的系统注册蒙古文处理系统引擎名,形成蒙古文处理系统引擎与操作系统的文字语言处理系统之间的接口;在蒙古文处理系统引擎中生成蒙古文处理模块,所述蒙古文处理模块基于预定的对应OpenType蒙古文字体的规则和结构,生成选形引擎对OpenType的蒙古文字体进行选形替换,经过选形替换后获得正确的蒙古文显示结果。在蒙古文处理系统引擎中建立输入法Panel模块,输入法Panel模块其采用xft渲染引擎绘制蒙古文而形成蒙古文输入法引擎;所述蒙古文输入法引擎与SCIM输入法平台之间建立接口,将所述蒙古文输入法引擎添加到SCIM输入法平台并由其统一调用和管理。其中,所述的蒙古文输入法引擎与SCIM输入法平台之间建立的接口由SCIM输入法平台生成。所述的蒙古文输入法引擎对按键处理时,有选择的捕获按键信息处理,其余按键信息由SCIM输入法平台处理;选择捕获的按键信息是定义的热键信息、符合蒙古文键盘布局的按键信息。蒙古文输入法引擎利用对蒙古文Unicode语料统计得到的蒙古文码表的查找结果、利用对蒙古文OpenType字体的控制字符添加的规律分析所得到的添加控制字符的规则而添加得到的结果,合并两个结果得到蒙古文Unicode控制字符的候选词。所述蒙古文处理系统引擎中建立的输入法Panel模块,产生一个候选词窗口显示蒙古文候选词。产生蒙古文候选词显示窗口包括根据所述显示蒙古文的方法将候选词文本串转换成字形串;所述的蒙古文输入法引擎使用Windows的XP/Vista系统下的数据结构将要显示的字形串进行270度旋转成为竖向排版,并采用在内存中预输出的方式防止闪屏,计算预期窗口大小尺寸;使用xft渲染引擎将候选词输出,记录和计算位置信息以正确输出候选词到相应的位置。
[0007] 本方法实现了在Linux操作系统上基于Unicode编码的蒙古文显示及其智能输入,并且该蒙古文显示方法及其智能输入法可以与汉语及其它已装载语言输入法同时使用而不影响其原有功能和应用(通过接口连接的模块化结构形式)。基于此,通过更换布局引擎,可以比较容易的移植到Linux KDE及Windows等系统下。目前已将其移植到Windows的XP和Vista系统下,运行稳定。本输入法具有简单易学、录入速度快、控制字符自动添加等诸多创新优点,并且采用了Unicode国际标准编码处理蒙古文字符,这极大地保障了蒙古文信息的交流传输。另外,实现词库对新词的自动添加,增强了输入法词库的开放性,另一方面可以通过用户的输入和交互从而提取大量的民族语言语料,进而为民族语言的监测和研究提供有力的依据,为民族工作的开展打下良好的基础。

附图说明

[0008] 下面将参照附图对本发明进行更详细的说明,其中:
[0009] 图1MStar在SCIM中的配置画面;
[0010] 图2MStar在linux的Gedit中的测试画面;
[0011] 图3MStar在windows的记事本中的测试画面;
[0012] 图4藏文OpenType字体组织结构;
[0013] 图5Script、Language System、Features和Lookup的关系;
[0014] 图6Pango体系结构示意图;
[0015] 图7蒙古文OpenType字体中的Features特征和Lookups替换(表);
[0016] 图8蒙古文OpenType字体中的Lookups示例;
[0017] 图9SCIM的客户服务器模式;
[0018] 图10本发明蒙古文智能输入方法在SCIM中的配置画面。
[0019] 图11布局引擎处理混合文本的工作流程
[0020] 图12选形引擎的实现
[0021] 图13词尾规则管理示意图

具体实施方式

[0022] 下面是如何实现蒙古文跨系统平台显示和智能输入的具体方式。
[0023] LINUX系统的GNOME平台显示
[0024] 蒙古文特点分析
[0025] 蒙古语言文字具有悠久的历史。在上千年的发展演变过程中前后出现过六种不同的文字形式。现行的蒙古文分三种:回鹘蒙古文、托忒蒙古文和斯拉夫蒙古文。回鹘蒙古文也叫传统蒙古文或老蒙古文,是从古回鹘文经过回鹘式蒙古文逐渐演变而来的一种拼音文字,主要通行于我国内蒙古自治区;托忒蒙古文是在旧蒙古文基础上改制而成的拼音文字,主要通行于新疆蒙古族地区;拉夫蒙古文亦称新蒙古文或基里尔字母蒙古文,是在俄文字母的基础上改制而成的,主要通行于蒙古人民共和国。
[0026] 传统蒙古文是一种比较复杂的文字,处理它的时候有一定的困难。总的来说有如下三个特征:
[0027] 1.传统蒙古文文字的书写格式是唯一从左到右,从上到下竖写的拼音文字,并且在一个词里,各个字符是连写的。
[0028] 2.与常用的汉字和英文不同,蒙古文有很多特性,传统蒙古文的字符可以分为名义字符和变形显现字符,并且两者之间的转换存在复杂的对应关系。其中“名义字符(character)”是指:供组织、控制或表示数据用的元素集合的一个元素,每个字符与一个Unicode标准中的码位(Code Point)相对应。“显现字形(glyph)”是指:字符的显现形式,一个字符根据它在词中的位置和前后所联接的字符的不同有一个或多个显现形式。
[0029] 3.传统蒙古文字符的‘音’和‘形’之间也存在多对多的复杂对应关系。
[0030] “某些语言文字在显示输出与编辑的时候,并不是按照一般语言字符(如拉丁语)那样从左到右按线性方式布局,而是要经过一些很特殊的处理。这样的语言文字,就称为复杂文字(Complex Text)”。由此可以看出,蒙古文也是一种复杂文字,在处理时存在较大的难度。
[0031] 在Unicode编码标准中,只收录了蒙古文(包括传统蒙古文、托忒文、锡伯文、满文)176个名义字符,其中包括蒙古文中的各种符号、字母和变体选择符、变体控制符等,没有对蒙古文显现字形进行编码和区分。其中传统蒙古文分配到35个码位的字符编码(编码区间为U1820-U1842)和7个控制字符(包括三个自由变体选择符FVS1(U180B),FVS2(U180C),FVS3(U180D),蒙古文元音间隔符(U180E),零宽连接符(U200D),零宽禁连符(U200C),窄宽度无间断空格(U202F))。
[0032] 蒙古文OpenType字体组织结构分析
[0033] 开发国际化软件需遵循Unicode编码标准,而蒙古文分配到Unicode码位数目与其需要显示的字形数量相差甚多,对此,本发明提供的方法,采用了OpenType字体与Unicode编码结合。
[0034] OpenType字体简介
[0035] 继TrueType字体格式之后,微软公司和Adobe公司联合推出了OpenType格式,这一崭新的字体格式不仅以压缩方式增加了对Postscript字体的支持,同时,在Unicode编码的大字符集基础上,采用多语种和多语系的编排方法,以适应更多的平台和全球性的国际字符集。此外,在功能上还容纳了多项传统排版软件才可具备的基本操作,如基线调整,竖排替换,灵活定位以及字符的组合和拆分等。
[0036] OpenType的字体库中通过设置相应的标记和预定义标记的内容来得到想要的字形,标记是OpenType字库最主要的特点之一,字库中可以设置四种标记:字符标记(Script tags)、语言标记(Languagetags)、特征标记(Feature tags)以及基线标记(Baseline tags)
[0037] OpenType布局表
[0038] OpenType字体在支持TrueType体系结构的基础上增加了一些高级排印特征,正是这些高级排印特征对复杂文本的处理提供了很好的支持,相应的特征数据放在如下的表中:
[0039] (1)基线数据表(BASE:Baseline)。
[0040] (2)字形定义表(GDEF:Glyph Definition)。
[0041] (3)字形替换表(GSUB:Glyph Substitution)。
[0042] (4)字形置位表(GPOS:Glyph Positioning)。
[0043] (5)字形调整表(JSTF:Justification)。
[0044] 上述表统称为OpenType布局表(OpenType Layout Table)。布局表的出现也是尽最大程度地让字体变得智能。下面简要介绍各个表的作用:
[0045] (1)BASE表
[0046] 如果一行文本由不同文字组成,常常会导致字形大小不一或者字形不在同一条直线上等问题。为了解决上述问题,在BASE表中提出了基线位置(Baseline Value)和每种文字的最大/最小延伸量(min/max extents)。BASE表使用的模型如下:假设特定大小的某种文字为文本处理中的主串(dominant run),所有其他基线均需相对于该主串进行定义。
[0047] (2)GDEF表
[0048] GDEF表为GSUB表、GPOS表提供了三类信息,在其内部表现为三个子表:字形分类定义(将字体中的字形分类);黏着点信息(标志了字形和其他的字形黏着的位置信息);连字的光标信息(提供了在连字中光标置位的信息和当涉及到连字时的文本选择处理信息)。这是一个可选的表,客户也可自行实现相应的功能。
[0049] (3)GSUB表
[0050] GSUB表存放了用于字形替换的信息。GSUB表中定义了如下的一些替换:
[0051] ①单一替换。以一个字形替换另一个字形。
[0052] ②多替换。以多个字形替换一个字形,如连字的分解。
[0053] ③变体替换。字符的多个变体之一来替换字符对应的字形。
[0054] ④连字替换。以连字字形替换一串字形,是第二种替换的逆过程。
[0055] ⑤上下文替换。上面几种替换的联合运用,在上下文中替换一个或多个字形。
[0056] ⑥链上下文替换。在链上下文中替换一个或多个字形。
[0057] (4)GPOS表
[0058] GPOS表提供了字形置位和黏着的信息,它支持如下的几种置位和黏着(Attachment)类型:
[0059] ①单一字形的位置调整,如上标或下标。
[0060] ②相关的两个字形的成对位置调整,如字间距的调整。
[0061] ③黏着点位置信息的。黏着点定义了一个字形和另一字形的黏着时黏着点位置的信息。
[0062] ④标记字符对应的字形与基本字符对于字形、连字及与它同类型的字形间的黏着。
[0063] ⑤依据上下文的置位,字形依据其周围的字形而确定自己及相互间的位置。
[0064] (4)JSTF表
[0065] JSTF表为字体开发者提供了对已经正确选形的文本进行定位和替换操作时的调整版面控制,文字处理模块可能根据JSTF表对词间距进行压缩或延伸以达到使一行文本外观和谐美观的效果。
[0066] 从对上述对于OpenType字体文件中部分表的介绍可以看出,OpenType提供了对蒙古文字的名义字符根据上下文进行选形的支持,也提供了不同的民族文字混排时对齐和进行位置调整的支持。
[0067] OpenType字体结构分析
[0068] 目前OpenType已经成为一种业内标准,越来越多的软件支持OpenType字体格式,越来越多的字体厂商将自己的字库升级到OpenType字体格式。Microsoft从Windows 2000系统开始兼容OpenType字库,其系统自带的西文字库都已升级到了OpenType字体格式,苹果公司也从MACOS X开始完全兼容OpenType字库。而Adobe公司不仅将自己Adobe字体全部升级到OpenType格式,还推出AdobeCreative Suite 2软件包,其中的InDesign,Illustrator和Photoshop对OpenType的排版特性都有非常好的支持。
[0069] 由此可见,利用OpenType字体中的布局表,可以用来很好的支持蒙古文的变形显示。目前,内蒙古大学和内蒙古师范大学也都在研发制作蒙古文OpenType字体、Windows Vista操作系统中也附带着微软公司的蒙古文OpenType字体。
[0070] 下面以藏文OpenType字体为例简要介绍OpenType字体中的标记信息,见图4所示。
[0071] Scripts Tag(字符标记)用于识别OpenType字体库中所设计的字符在Unicode编码段中的位置。例如藏文字符的字符标记是“tibt”,而蒙古文字符的字符标记是“mong”。Language Tag(语言标记)用于识别OpenType字库中所设计的字符所支持的语言系统。支持蒙古文的语言系统的语言标记应该是“mo”,但为了使字体更好的能与别的语言系统的字体协同工作,选用默认值“dflt”。FeatureTags(特征标记)用于决定如何从字库中选择一个字形。特征标记中可以定义字形替换、字形置位布局以及字形替换兼置位布局,是OpenType字库中最重要的部分。而这些Feature(特征)是定义在GSUB表中和GPOS表中的,下面介绍GSUB和GPOS表的组织结构及其工作原理。
[0072] GSUB和GPOS的组织结构
[0073] GSUB表和GPOS表提供的功能覆盖了几乎所有复杂文本处理的要求,包含了在字形处理过程中用到的所有有关替换和相关字形置位的信息。这两个表都是开始于一个定义了字形链表(ScriptList)、特征链表(FeatureList)和查找链表(LookupList)偏移的头。GSUB/GPOS表中每一种替换/置位格式类型对应于一个Lookup(查找、替换)数据。Lookup结构包含了具体的替换和置位数据信息。图5为GSUB/GPOS表的组织结构。
[0074] 1)字形链表标志了字体文件中所支持的文字和语言系统,每种文字可由几种语言组成。
[0075] 2)特征链表定义了在呈现这些文字前语言系统所要求的字形替换(置位)特征。
[0076] 3)查找链表包括所有实现字形替换(置位)所需的查找数据。
[0077] 访问GSUB/GPOS表的工作流程
[0078] GSUB/GPOS表以如下的方式来确定查找数据(Lookup):文字->语言系统->相应特征->查找数据。具体步骤为:
[0079] 1)确定当前工作的文字在表中的位置及确定文字的种类。
[0080] 2)如果已知语言系统,则在确定的文字中查询语言系统表(LangSys Table);否则使用文字表中缺省的语言系统表(DefaultLangSys Table)。
[0081] 3)语言系统表提供了特征链表的索引数,以此可访问所需求的特征。
[0082] 4)检查每个特征的特征标签,选择要应用到字形串的特征(Feature)。
[0083] 5)每个特征又提供了到查找链表(LookupList Table)的索引数数组。查找数据(Lookup Data)是在一个或多个子表中定义,这些子表定义了特定字形及对其实施各种操作的信息。
[0084] 6)组合所有的由特征集对应的查找数据,并应用它们实施具体的替换和置位操作。
[0085] 访问OpenType字体中的布局表,需要用到布局引擎(LayoutEngine),不同的操作系统平台有着不同的布局引擎,甚至一些大型的文字处理软件也有其自己的布局引擎。
[0086] 因此,将结合OpenType字体与Unicode来实现本发明的蒙古文显示和智能输入。
[0087] 操作系统的布局引擎简介
[0088] 使用OpenType字体需要布局引擎支持实现蒙古文的显示和输入。不同的操作系统有着不同的布局引擎:如Windows系统,其布局引擎是Uniscribe;现行的Linux操作系统最常用的桌面系统GNOME系统使用的布局引擎是Pango。
[0089] Uniscribe
[0090] Uniscribe是微软公司开发的Windows操作系统为高质量排版文字和处理复杂文字而开发的组件。不论是简单文本还是复杂文本若需要高质量的排版,需要一种特殊的处理方法,因为字符(“字形”)不是按照一个简单的布局方式。对于复杂文本,管理字形的形状和位置的规则被指定的存放在符合Unicode编码的OpenType字库中。
[0091] Uniscribe从Windows 2000开始连同Windows一起捆绑;Win9x的用户在更新至Internet Explorer 5.0之后,系统亦会安装有本组件。系统的核心是一个名为USP10.DLL的动态链接库。此外,WindowsCE从5.0开始亦支持Uniscribe。
[0092] Pango
[0093] Pango是GTK+和GNOME的分支,其目标是在GTK+GNOME环境中进行操作,支持国际上主要语言的输出。
[0094] Pango库是实现多种语言文字处理输出的一个系统,可以处理Unicode编码的文本,其本身采用模块化编程思想。语言模块分为两种,一种是基本处理模块,对文字只是简单的处理,不包括对字形的选形等操作,在基本模块中支持罗马文字、希腊文、西里尔文、简体中文和繁体中文以及日文。另一种语言模块是针对复杂文字的语言模块,于此,通过在Pango库的复杂文字语言模块中,接入蒙古文选形引擎模块,实现蒙古文从名义字符到变形显现字符的替换,从而完成支持蒙古文在GNOME平台上的变形显示。
[0095] 这里,Pango以模块化方式、根据处理语言和文字时的流程对模块进行了详细的划分,按照模块与待处理的文字究竟属于哪种语言相关与否,进行相应的划分,选用不同的文字处理模块进行字符的选形与显示,因而其仅对Pango新植入处理模块,对整个Pango库的修改最小并且简便易于移植。
[0096] 传统蒙古文在LINUX-GNOME的正常显示的实现模块如图11所示
[0097] Pango中对实现蒙古文变形显示的支持
[0098] Pango的体系结构如图6所示。Pango位于底层库函数和上层应用程序工具集(ToolKit)之间,处理从上层应用程序传递下来的文字信息,主要负责各种文字的选形、显示、界面处理等工作;Pango除了包含Pango的核心之外还包括一系列与X(与窗口显示或消息处理的底层)相关的函数集合,以及字形和语言函数集合,为操作系统的桌面系统、应用程序等和底层库函数之间架起了一座桥梁。
[0099] 构造Pango的内部组织结构,对于不同语系的Unicode文本采用相应的语言处理模块进行处理。定义Pango库中的关键类:
[0100] PangoEngine类--处理语言文本的引擎
[0101] PangoEngineClass类--处理语言文本的引擎具体封装的实现
[0102] PangoEngineShape类(处理的是基于字体规则的语言文本)、PangoEngineLang类(处理的是基于词典规则的语言文本)--构造具体的引擎,为特定的语言文本设计的具体的选形系统,是Pango的一个独立的部分。这些引擎与Pango进行以管道方式进行数据交流。本发明即通过具体实现该选形系统完成蒙古文的PANGO下的显示。
[0103] PangoEngineShapeClass类、PangoEngineLangClass类--封装了具体的选形显示的方法。实现如下功能:给定一个字体,一段文本和一个PangoAnalysis文本分析结构,将文本中的字符串转化为目标结果字形串。并将结果字形串保存在PangoGlyphString结构中,最终提供给操作系统或者字处理程序输出。
[0104] 各个与语言文字处理和显示有关的模块等,都放在Pango的modules模块子目录下,在编译时将这些模块编译成动态链接库,布局引擎在处理文本时,首先按照文本中的字符编码将文本确定为某个语系,接着调用相应的处理模块进行处理,产生最终的目标字形串。
[0105] 在Pango库中定义了一个PangoScript枚举类型,在PangoScript中定义了各个语系的标识,蒙古文定义为PANGO_SCRIPT_MONGOLIAN即标识明确运行的是蒙古文语系的处理系统(如蒙古文处理引擎等)。在Pango中定义了PANGO_MODULE_ENTRY即Pango与各个模块的接口方法,其参数可以是init,exit,list,create,分别代表各个模块的不同动作。Pango中又定义了PANGO_ENGINE_SHAPE_DEFINE_TYPE(name,prefix,class_init,instance_init)方法,从而规定了各个模块引擎注册的名字,模块引擎的符号,模块引擎的初始化,以及模块引擎实例的初始化。
[0106] Pango中建立蒙古文处理模块(Unicode编码标准的支持)
[0107] 蒙古文处理模块是遵循Unicode编码标准的蒙古文选形,Linux机内码支持Unicode编码标准。
[0108] 从Pango内部组织结构及模块的工作原理角度而言,蒙古文同其他语言一样也占用相应的一段Unicode编码区间,且PangoScript枚举类型中也为蒙古文定义了相应的语系标记。
[0109] 蒙古文的变形是基于字体配置的,处理模块完成蒙古文选形的过程即通过每个类具体封装而实现具体蒙文选形显示方法。
[0110] 如:定 义 PangoEngineShape 为 MongolianEngineFc、PangoEngineShapeClass为MongolianEngineShapeFcClass 即 确 定 是 进 行 蒙 古 文 字 形 选 形。 新 定义 PangoEngineScriptinfo 类 型 数 据 mongolian_scripts 为 {PANGO_SCRIPT_MONGOLIAN,″*″}、重写PANGO_ENGINE_SHAPE_DEFINE_TYPE方法为PANGO_ENGINE_SHAPE_DEFINE_TYPE(MongolianEngineFc,mongolian_engine_fc,mongolian_engine_fc_class_init,NULL)等,从而在mongolian_engine_shape中实现蒙古文选形。后面将描述封装的方法的具体实施流程。
[0111] Pango添加蒙古文处理模块实现蒙古文正确显示(OpenType字体的支持)[0112] 蒙古文的正确显示至少需要用到OpenType字体的GSUB表,组成结构如图7所示。图7的字体中定义了六个Feature特征,即calt,init,isol,medi,rlig,fina,分别表示上下文替换、词首替换、独立体替换、词中替换、连体替换、词尾替换。这些Feature将OpenType字体中的字形替换规则进行了分类,对这些规则进行管理。字体中的替换规则都放在Lookup替换表中,一个Lookup对应的一条替换规则。众多的Lookup归属于定义的Feature。图8是隶属于init特征的一些Lookup。如蒙古文字符 在词首的时候应该显示为 此时会用到上图中的第一个Lookup。每一个Lookup都定义为若干个字形串转化为若干个字形串的形式,可能是一个字形替换为一个字形,也可能是多个字形替换成一个字形,还有可能是几个字形替换为另几个字形。
[0113] 蒙古文的正确显示大体会受到下述规则的制约:
[0114] 1)字符在词里的位置。有些字符在词首、词中、词尾、独立体的显示是各不相同的。
[0115] 2)自由变体选择符FVS1、FVS2、FVS3的选择。程序或使用者可以选择不同自由变体选择符,将邻近的字形替换成相应的字形进行显示。
[0116] 3)音节、词性引起的变形,蒙古文的一个词分为若干个音节,由元音和辅音组成的音节以及词性(阴性、中性、阳性)都会影响字形的变形。音节与音节之间的相互关系也有可能导致变形。
[0117] 选形实现过程:
[0118] 在PANGO系统下,实现蒙古文处理模块的接口。在PANGO的复杂语言文字处理模块中,定义语言处理引擎系统名称,比如,定义SCRIPT_ENGINE_
NAME--”MongolianScriptEngineFc”,以标识本蒙古文选形系统引擎的名字、将PangoEngineShape定 义 为 MongolianEngineFc,将PangoEngineShapeClass 定 义 为MongolianEngineFcClass,定 义PangoEngineScriptInfo结 构 类型 数 据mongolian_scripts为{PANGO_SCRIPT_MONGOLIAN,”*”}等,以与蒙古文选形处理相对应。实现PANGO_ENGINE_SHAPE_DEFINE_TYPE(MongolianEngineFc,mongolian_engine_fc,mongolian_engine_fc_class_init,NULL),从而对蒙古文引擎进行定义和关联。重写了PANGO_MODULE_ENTRY的四个方法,尤其是PANGO_MODULE_ENTRY(create)和PANGO_MODULE_ENTRY(init)。
其中在PANGO_MODULE_ENTRY(create)方法中如果当前Pango引擎的ID号即名称与本模块引擎的名字相同(如ID指的是蒙古文处理,与本模块引擎也是蒙古文处理引擎名称相同),于是PANGO中复杂语言处理模块就会创建一个新的蒙古文引擎。而PANGO_MODULE_ENTRY(init)方法中,向PANGO的管理模块注册新的蒙古文引擎模块。还有其他的两个模块方法与上述两个类似,不再赘述。总的来说,是通过在PANGO系统关于复杂语言处理的模块部分,定义蒙古文处理系统引擎的名称由复杂语言处理模块根据名称创建该引擎,或将该处理系统引擎模块的名称注册到PANGO系统的管理模块进而接入该引擎等,从而在PANGO系统下构造接口,建立起PANGO系统的蒙古文处理系统引擎。
[0119] 蒙古文处理模块的选形引擎实现:
[0120] 在mongolian_engine_fc_class_init函数中选择当前选形引擎为mongolian_engine_shape完成选形显示方法。下面是mongolian_engine_shape蒙古文选形显示的具体实现过程。
[0121] 本发明的蒙古文变形显示方法,在其实现过程中,字形需要使用合适的lookup替换表来进行替换才能正确显示(OpenType字体的GSUB表中的lookup替换规则),而所有的lookup是按Feature来分类的,所以需要将feature进行标记。再将文本中的字形进行合适的标记,用两者的标记信息进行匹配,使得字形可以通过合适的Feature中的Lookup进行替换:
[0122] 1)OpenType字体中Feature的属性值定义与待选形字形属性值的定义:
[0123] 通过查看Pango中对OpenType字体的操作源文件实现,可知字形与Feature进行配对时,使用字形的属性信息与Feature的属性信息进行按位与非运算。有些Feature需要作用于所有的Glyph,有些Feature只需要作用于某些Glyph。如图7的OpenType字体库的init Feature只是作用于编码从U1820到U1842的部分名义字符;而calt Feature几乎需要作用于字体库中所有的字形。本选形引擎可定义各个Feature属性信息如下:
[0124] 表1GSub表中Feature的定义和取值
[0125] PangoOTFeatureMap Property_bit替换种类
[0126] PANGO_OT_TAG_MAKE(‘i’,’n’,’init(值取词首i’,’t’)0x0001)[0127] PANGO_OT_TAG_MAKE(‘m’,’e’,’medi(值取词中d’,’i’)0x0002)[0128] PANGO_OT_TAG_MAKE(‘f’,’i’,’fina(值取词尾n’,’a’)0x0004)[0129] PANGO_OT_TAG_MAKE(‘i’,’s’,’isol(值取独立体o’,’l’)0x0008)[0130] PANGO_OT_TAG_MAKE(‘r’,’l’,’0xFFFF连字替换i’,’g’)
[0131] PANGO_OT_TAG_MAKE(‘c’,’a’,’0xFFFF上下文替换l’,’t’)[0132] 在替换过程中字形的属性信息要与需要使用的Feature的属性信息进行与非操作,我们可以定义几个常量ginit,gmedi,gisol,gfina做为字形的属性信息,ginit可取medi,fina,isol的或,gmedi可取剩余三个即init,isol,fina的或。其余情况相同,在此就不一一列举。需要说明的是Feature属性是calt与rlig的属性值选为0xFFFF,无论与ginit,gmedi,gisol,gfina中的任何一个进行匹配时结果后四位都不是全零,可知属性值是calt与rlig的feature使用于所有的字形。这是符合我们设计需要的,即规则的定义便于后续的替换,从而实现变形(选形)显示。
[0133] 2)其中,混合文本的预处理(图11):
[0134] 一段文本可能是蒙古文、汉文、英文及其他语言的组合文本,因为前文提到的我们蒙古文OpenType字体中的Language Scripts(语言标记)最好设置为默认值,所以,我们需要对文本中的字符进行判断,对非蒙古文字符刻意的放弃处理,防止其他文种的字符丢失。本选形系统可以根据蒙古文的Unicode编码区间(U1820-U1842、U180B-U180E、U200C、U200D、U202F)来区分是否是蒙古文字符,若是蒙古文字符则进行相应的处理(蒙古文--处理模块注册名将蒙古文处理模块注册到Pango库,正确的蒙古文显示),否则放弃处理,交给Pango库处理。剩下的蒙古文字符文本会被切割为若干个小片段。
[0135] 3)按“字形簇”为单位划分蒙古文文本,参见图12。
[0136] 在文字排版中,与文字流相关的单位依次为:文章、段、行、字。多文种混排与单一文种排版在文章、段、行、的处理上没有太大的差别,主要差别在于字在行中的表现行为。这里的“字”是指文字流的基本单元,在Unicode中,用户默认的文字处理单元的概念不是字符,而是由一个或多个字符组成的“字形簇”(grapheme cluster)。
[0137] 构成同一个字形簇中的字符必须同时参与选形和置位,如蒙古文中控制符和被控字符必须作为一个整体同时参与选形和置位。将文本划分字形簇需要考虑到文本所在语系的一些特征,不同语系的文本划分字形簇的方法也不同,下面详细介绍了蒙古文文本的字形簇划分方法。
[0138] 将蒙古文文本以字形簇为单位进行划分,如可以按下述方法划分:
[0139] 元音+辅音+控制字符;
[0140] 辅音+元音+控制字符;
[0141] 辅音+元音;
[0142] 辅音+控制字符;
[0143] 元音+辅音;
[0144] 元音+控制字符;
[0145] 控制字符+元音;或者,
[0146] 单个的元音字符或辅音字符。
[0147] 其中元音、辅音、控制字符可以通过各自的Unicode编码枚举分类。同时,字形簇的划分中可能会出现歧义问题,本选形系统采用最大匹配法结合将控制字符分类的方法进行消除歧义。蒙古文的七个控制字符的作用,有的是使其前面的字符发生变形,有的是使其后面的字符发生变形,有的是前面后面的字符都可能引起变形。可以将这些控制字符分称三类,利用其含义消除歧义。若歧义是由第一种控制字符引起的,可偏向于将控制字符向前划分;若歧义是由第二种控制字符引起的,则偏向与向后划分;第三种控制字符引起的歧义问题,考虑到第三种控制字符的作用通常是上下文替换,可以将其偏向向前划分,在之后的访问GSUB表的Feature时可以自动的消除歧义,即如果字体中定义了关于该字符的上下文替换的规则,则利用Lookup进行替换,否则原本就不是歧义问题。图11中,180E、202F为控制码(即对应着控制字符),其他为辅音、元音,将这些辅音、元音、控制字符按照相应的规定划分成字形簇即1、2、3、......7。
[0148] 将蒙古文文本小片段划分为若干个字符簇,下面就可以按字形簇为单位进行处理。
[0149] 4)蒙古文字符串自动选形系统的实现,参见图12。
[0150] 上面的文本预处理操作得到的结果是若干个蒙古文小片段,选形系统依次处理每一个片段,在处理每个片段时是按字形簇为单位处理的。具体的处理过程如下:
[0151] 首先,将构成一个字形簇(如划分的1、2、......或7)的字符串通过访问OpenType字体得到对应的字形索引串。具体实现是:依次选择字符串中的字符,通过编码访问OpenType字体得到该字符在字体中的索引号,再将这些得到的索引号连接得到的索引序列成为字形索引串。在不引起歧义的情况下,我们将字形索引串简称为字形串,将字形簇简称为簇。
[0152] 接着分析该簇为字形串贴上特征标签(首、尾、中、独),用来标记使用哪些OpenType中的Lookup进行替换(即正确对应的lookup)。由于蒙古文中的控制字符的含义不同,为字形串贴标签也变得比较复杂。如果是简单的将字形串的第一个字形贴上init标签,最后一个贴上fina标签,其余统统贴medi标签,经实验证明是无法完成蒙古文的正确显示的。所以需综合考虑簇的组成部分、簇与蒙古文片段中的位置关系以及前后的一些特殊的控制符对其的影响。
[0153] 对于长度为一的簇来说,会有四种可能需考虑。
[0154] ●第一种可能,当前字符是控制字符,或者该簇就是一个片段,或者该簇后面接的是U200C(零宽度禁连符)并且该字符是片段中的第一个字符,此时需要为该字形贴上gisol标签。
[0155] ●第二种可能,当前字符是片段中的最后一个字符、后面接的字符是U180E或U202F、或者后接字符是U200C且当前字符不是本片段中的第一个字符,此时需要给该字形贴上gfina标签。
[0156] ●第三种可能,当前字符是第一个字符、当前字符不是第一个字符但是前面字符是U200C(零宽度禁连符),此时需要给该字形贴上ginit标签。
[0157] ●第四种可能,都是一些普通的情况,直接贴gmedi标签即可。
[0158] 长度为二的簇是最复杂的一种情况,因为构成长度为二的簇有很多种情况,如辅音+元音、辅音+控制字符、元音+辅音、元音+控制字符、控制字符+元音。本选形系统对长度为二的簇的分析是先分类,分成内部有控制字符和内部无控制字符两类。对于内部无控制字符的簇处理起来相对简单,只需要考虑簇在片段中的位置和簇前后的一些控制符。具体贴标签方法如下:
[0159] ●字形簇中没有控制字符的情况:
[0160] 如果该簇本身就是一个片段,也就是说这个片段只有两个蒙古文字符。此时前后一定是没有控制字符的,这种情况只需为第一个字形贴ginit标签,第二个字形贴gfina标签。
[0161] 否则该簇是片段中的一部分,接着就分析该簇在片段中的位置信息。如果该簇是片段的开始部分,此时为该簇的第一个字形贴ginit标签,第二个字形贴gmedi标签;如果该簇是片段的结尾部分,则为第一个字形贴gmedi标签,第二个字形贴gfina标签;剩余的情况就是该簇是片段中的中间部分,对于这种情况只需要为第一个字形和第二个字形都贴gmedi标签。
[0162] ●字形簇中有控制字符的情况:
[0163] 内部有控制字符的簇处理起来相对复杂一些。如果本簇就是一个片段,由于有一个控制字符,所以贴标签的时候可以将第一个和第二个字形都贴上gisol标签;如果本簇是片段的开始部分则将控制字符贴gisol标签,另一个字形贴ginit标签;如果本簇是片段的结尾部分,则为控制字符贴gisol标签,另一个字形贴gfina标签;另一种情况就是簇在片段的中间,此时为控制字符贴gisol标签,为另一字形贴gmedi标签。
[0164] 长度为三的簇可能由元音+辅音+控制字符或者辅音+元音+控制字符构成。
[0165] 如果该簇是片段的开始部分,则第一个字形贴ginit标签,否则需贴gmedi标签。第二个字形贴标签时需要考虑后面控制字符的影响,如果本簇后面接的是U180E或者U202F控制字符,此时需将第二个字形贴gfina标签;此时需要注意蒙古文字符的一些特殊编码情况,Unicode基本上都是为蒙古文字符的独立体形式编码,只有两个是特殊的,U1824和U1826是词首形式编码。如果第二个字符是U1824或U1826,则需要为第二个字形贴ginit标签。第三个字符因为是控制字符,则直接贴gisol标签即可。
[0166] 通过上述的贴标签过程,得到的结果是一个贴有标签信息的字形串缓冲。接下来就是访问OpenType字体中的GSUB表进行选形。选形替换过程大致如下:
[0167] 先读入OpenType中的Feature的数目,进行循环,将隶属于各个Feature的Lookup的表头链接加到一个HB_GSUB数据结构链表上,这样就装载了所有的Feature以便于后面的使用。
[0168] 接着将这些贴有标签信息的字符串缓冲进行处理,处理也是一个循环的过程,循环次数是字体中的Feature数目,这样保证了所有的Lookup都有机会参与替换。用到的具体替换分为单字形替换、多字形替换和上下文替换。首先进行的是单字形替换,根据上述贴的ginit、gmedi、gfina和gisol进行替换。再将得到的结果进行多字形替换,这里的多字形替换指的是上文提到的连体替换,上文提到rlig特征的取值是0xFFFF,则之前的字形串缓冲中的特征信息与rlig特征是不冲突的,只要是满足lookup中的替换条件就可以。可见任意的字形串缓冲都有机会去标记是rlig的Feature中使用Lookup的。最后进行的替换是上下文替换,前文提到calt特征的取值是0xFFFF,标记是calt的Feature的使用范围类似与标记是rlig的Feature,是对前面两次替换的最终替换,结果是最终要显示的目标字形串。由此,通过利用OpenType字体中的规则惊进行的选形替换得到最后正确的显示结果(如12)。
[0169] 具有上述接口和显示能力的蒙古文处理模块也很容易通过该接口和模块化的形式移植到WINDOWS系统实现跨平台显示。
[0170] 基于显示而改进的智能输入方法
[0171] LINUX系统下已有的输入法协议
[0172] 目前在Linux平台上,存在很多种输入法。在台湾的繁体中文平台上,流行的是xcin;在大陆的简体中文平台上有最初的chinput,红旗的rfinput,小企鹅输入法fcitx,这些输入法是基于XIM协议实现的(X Input Method是X-Window系统下的符合国际化标准的输入法协议)。不同于XIM协议实现的输入法框架,有新近出现的SCIM(Smart Common Input Method platform支持多国语言的输入法平台)和IIIMF(Internet/Intranet Input Method Framework互联网/内联网输入法框架,多语言输入法平台)输入法协议,GNOME的GTK IM Module(GTK输入法模块)等。
[0173] 本发明的智能输入方法是基于SCIM协议。SCIM,SCIM通过前端和不同的客户程序交互,在后端实现IME输入法编辑器的管理,其具有:
[0174] 1)对UNICODE提供全面支持。
[0175] 2)高度模块化。
[0176] 3)支持动态加载不同的输入法引擎,支持C/S模式运行。
[0177] LINUX系统下的SCIM协议类似于Windows系统下的IMM(输入法管理器),不同的输入法引擎都由SCIM统一管理。在安装新的输入法引擎和卸载输入法引擎时都十分的方便和简单,也可以选择启用哪些输入法引擎而不用去卸载它。
[0178] 蒙古文的处理是基于Unicode编码的,故在编码方面SCIM处理蒙古文是可行的。不同的输入法引擎是独立于通用的SCIM协议而工作,不同的输入法引擎可以实现SCIM框架为输入法引擎模块提供的接口,并编译成动态链接库。由框架动态的调用进行工作。
[0179] 尽管SCIM有着上述诸多优点,但在蒙古文智能输入法开发过程中仍存在许多技术难题,这其中面临的最大问题是候选词窗口中的蒙古文的竖向显示,因为SCIM提供的输入法Panel模块(控制板模块)不支持蒙古文的变形显示也不支持竖向显示。本发明是通过不使用SCIM本身的Panel模块,采用外挂式的Panel的方式,从蒙古文处理系统引擎的内部实现了一个Panel,对其他输入法引擎以及SCIM框架本身不会有任何的影响。而对蒙古文的绘制问题可以采用一定的渲染引擎进行绘制,本输入法引擎选用的是xft渲染引擎。
[0180] LINUX系统下的蒙古文智能输入法(“蒙文之星”Mstar)
[0181] (一)输入法引擎的接口
[0182] 使用SCIM开发一个新的智能输入法引擎,需要派生出IMEngineFactoryBase和IMEngineInstanceBase两个类的子类。本智能输入法派生出来的类是MStarFactory和MStarInstance。MStarFactory负责管理本智能输入法的ID号、名字和所在语系信息。MStarInstance负责引擎的具体处理过程,它是一个对输入法上下文的封装的类。每建立一个本智能输入法的上下文(在应用程序中激活本输入法)就会由MStarFactory创建一个新的MStarInstance对象。关闭上下文时调用MStarInstance析构函数销毁对象。
[0183] MStarInstance需要重写IMEngineInstanceBase类中的一些关键的虚函数。如 virtual bool process_key_event(const KeyEvent&key) 和 virtual void send_string(wchar_t*str)。前一个函数用于处理接收到的按键信息,比如,每一次按键都会触发这个函数,它的参数是按键码,可以根据按键码决定怎么处理这次按键事件,若不希望输入法处理则直接返回false,将刚才的按键事件发送给应用程序,否则调用相应的处理程序,这个函数是输入法引擎转化按键序列到目标结果串编码序列的入口。后一个函数的作用是提交结果串给应用程序,完成一次录入。
[0184] (二)输入法引擎对按键的处理
[0185] 基本上所有的输入法都会定义一些特殊的键或组合键来完成特定的功能,人们称之为热键。例如,在拼音输入法中的中英文切换、全/半角切换等功能往往可以用鼠标点击来实现,也可以用定义的一些热键来进行切换。
[0186] 输入法引擎并不是要处理所有的按键信息,是有选择的捕获一些按键进行处理,剩余的按键信息交给应用程序或者输入法框架去处理。本智能输入法只捕获两类按键信息,一类是定义的热键信息,另一类是符合蒙古文键盘布局的按键信息。在本输入法引擎中定义了符合用户习惯的一些热键,如Shift+Space全/半角切换,Control+Space输入法引擎开启/关闭切换等。在键盘布局方面,本智能输入法使用的是确精扎布先生的著作《蒙古文编码》中定义的蒙古文通用键盘布局。本智能输入法工作流程大致如下:
[0187] 1.将接收到的按键信息进行判断,如果按键信息既不是热键也不是键盘布局中涉及的按键,则放弃处理,否则进行下面的处理。
[0188] 2.按键信息是定义的某一热键,则改变一些相应的标记变量,并做出一定的变化动作。如:有一个标记变量用来标记当前输入法状态是全角还是半角,当前的按键正好是定义的全/半角切换功能热键,此时需要改变该变量的值,并且将面板上的图标进行更改,在全角和半角的图标之间进行切换。另外的一些热键如蒙文/英文的切换等工作原理类似,在次就不在一一例举。
[0189] 3.按键信息不是热键,是要处理的字符按键。这类按键可以分为两类,一类是字符按键,如’a’,’z’等,另一类是一些特殊的按键,如回车符、空格、退格符、删除符、光标的左右按键、Home、End、数字键等特殊按键。
[0190] 1)字符按键的处理
[0191] 字符按键可以插入在一个数组中,该数组用来记录当前的按键序列,同时还需配有一个游标指向数组中的当前字符位置。每接收到一个字符按键事件,将这个按键的编码插到数组的游标位置之后,并依次将数组中的每个字符通过访问键盘布局文件得到的蒙古文编码插入到另一个数组中。这个数组用来记录对应的蒙文串,同时还需要配有一个游标,标注当前的插入位置。两个游标保持相对同步,可能是移动的步长不一,但在各自内部的相对位置是始终保持一致的。
[0192] 2)对于一些特殊的按键,需要相应的处理:
[0193] 回车符的处理,本智能输入法是将保存得到的英文按键串提交给应用程序,同时将保存英文字符和蒙文字符的两个数组都清空,两个游标都复位成指向数组的起始位置,并且使预编辑窗口和状态窗口内容擦除并隐藏。
[0194] 空格符的处理,是将候选词组中的第一个候选词提交给应用程序,同时完成与回车符相同的一些清空、复位以及隐藏窗口操作。
[0195] 退格符和删除符的处理,将英文按键串和蒙古文串都向前或向后删除一个单元。如果删除出界,可以给用户发出一个声音提示,并且不做任何处理,防止内存越界。
[0196] 光标的左右按键、Home、End的处理,此类按键不会影响保存的按键编码串和蒙文串,只是改变了两个数组中的游标位置;Home键的处理是将两个游标都复位成数组的开始位置,End键的处理是将两个游标都置成串的最后一个位置;光标的左右按键是将游标先前或向后移动一个单位,在发生移动越界的时候,可以给用户发出一个声音提示,不做任何处理。
[0197] 数字键的处理,第一种情况,按键序列不空时,数字键用于选择候选词,此时,通过敲击提示数字键,选择相应的候选词提交给应用程序。另一种情况,按键序列为空时,利用单个数字键敲击出一些常用的词。需要说明的是,此时,候选词可能又会有好几个,一旦发现按键序列不空,数字键又恢复了选择功能。
[0198] 由此,不需要录入员额外的培训及记忆,使该智能输入法使用更为简单,方便了用户的使用,提高了录入速度。也实现了蒙古文输入过程中的词汇记忆和交互功能。
[0199] (三)候选词的生成
[0200] 由于蒙古文控制字符的存在,使得候选词的生成不是简单的蒙古文字符的拼接,也就是说蒙文串并不一定是需要的目标结果串。绝大多数用户根本就没有控制字符的概念,为了方便于用户的使用,本智能输入法需要自动的添加控制字符,使用户感觉不到有控制字符的存在。但控制字符的添加是很难总结出规律的,所以本研究选用了统计与规则相结合的办法来产生候选词。总的来说候选词的生成是分为两部分。
[0201] 第一部分是基于统计的,内蒙古师范大学的嘎日迪教授为本研究提供了大量的蒙古文Unicode语料,通过对语料的处理及一系列操作,整理出了一张蒙古文码表。在输入过程中可以通过按键编码串查找码表得到若干个候选词。
[0202] 第二部分是基于规则的,通过对蒙古文OpenType字体中规则的查看以及蒙古语专家的总结,大体总结了一些控制字符添加的规则。这部分候选词的生成是将蒙文串按照这些总结出来的规则自动的添加得到的。如按键序列根据蒙古文键盘布局得到对应蒙古文字符串(1个)、再根据添加规则添加得到若干结果。
[0203] 最后将这两部分结果进行组合,同时删去多余的相同的候选词,作为本次输入的最终候选词结果(并集)。从而也就实现了在输入过程中对蒙古文Unicode控制字符的自动添加。
[0204] 如,根据确精扎布先生的《蒙古文编码》上控制字符的含义和传统蒙古文构词特点整理出一些规则,依靠这些规则自动添加控制字符:在词尾有时候需要显示成 而有时候却要加上控制字符,让其显示为 ,则可以针对这个情况增加一条规则插入180E控制字符。图13示意了一种规则管理的情况(词尾规则的情况),将规则分为四块(词首、词中、词尾、独立体)。
[0205] (四)候选窗口的处理(控制字符的选择输入)
[0206] 由于SCIM提供的Panel部分不支持蒙古文的显示,本智能输入法放弃SCIM提供的Panel,新产生一个候选词窗口,将蒙古文候选词显示出来。
[0207] 首先,需要将候选词文本串都转换为字形串(依据之前描述的蒙古文显示方法)。接着,就需要将这些字形串进行竖向旋转并显示,本输入法引擎使用的是Pango库的数据结构,如PangoMatrix,对这个数据结构进行270度旋转使其变成竖向排版。为了避免显示出现闪屏现象,本智能输入法采用在内存中预输出的方法,同时计算预期窗口大小尺寸。每一次按键事件都可能进行一次候选词的生成,为显示尺寸与窗口尺寸规定一个阈值,当显示尺寸比原先窗口尺寸大于这个阈值时,扩大窗口尺寸。当显示尺寸比原先窗口尺寸小于这个阈值时,缩小窗口尺寸。这种动态变化的界面,会显得比较协调,给用户带来友好的感觉。
[0208] 最后,使用Xft渲染引擎将其输出,当然在输出的时候需要记录并计算一些位置信息,通过这些信息最终用pango_xft_render_transformed函数将其输出到相应的位置。
[0209] 本发明的蒙古文Unicode拼音智能输入法能在GNOME系统下稳定工作,若更换复杂文本引擎可以很方便的将本智能输入法移植到其他系统上,如能移植到Window XP/Vista下,从而也就解决了WindowsVista环境下用户只能通过自己输入Unicode控制字符来实现蒙古文名义字符转换为变形显现字符的问题,实现了在输入过程中的控制字符的自动添加。图1、图2、图3为其工作测试画面。由此,实现了蒙古文跨操作系统平台的输入和显示,且不同的输入法之间不发生冲突(由于Unicode和外挂模块)。【注:IME输入法引擎;socket server套接字服务器;X11 frontend为X11前端;X App为X应用程序;GTKApp为GTK应用程序;GTK IMModule为GTK输入法模块;Panel为控制板】
[0210] 显而易见,在此描述的本发明可以有许多变化,这种变化不能认为偏离本发明的精神和范围。因此,所有对本领域技术人员显而易见的改变,都包括在本权利要求书的涵盖范围之内。