APP下载

基于QTE的蒙古文显示机制研究与实现

2010-06-05白凤山范道尔吉金宇新张利宏

中文信息学报 2010年6期
关键词:蒙古文字符绘制

白凤山,范道尔吉,金宇新,吴 威,张利宏

(内蒙古大学 电子信息工程学院,内蒙古 呼和浩特 010021)

1 引言

在嵌入式Linux环境下处理蒙古文的技术还处于起步阶段,这主要由于蒙古文不同于中、英文的语法和书写特点,蒙古文要求竖直从上到下,从左到右排版。QTE是嵌入式Linux比较流行的图形库和中间件,也提供了基于Unicode的文字处理引擎,但QTE不支持蒙古文的竖排显示和变形机制。蒙古文国际标准编码字符集中只按蒙古文语音收入了抽象的蒙古文名义字符,包括传统蒙古文的7个元音、27个辅音、11个标点符号、10个数字和4个控制字符[1]。同一个蒙古文字符的书写(显现形式)会根据其在词语中的位置不同、单词词性等属性不同而发生变化,即呈现在人们面前的是该字符变化后的形式(称为显现字符)。由于ISO/IEC 10646标准中没有收入蒙古文显现字符,因此在显示蒙古文时需要将蒙古文的名义字符根据上下文联系映射到其相应的显现字符,这对蒙古文的显示处理带来了很大困难。

2 蒙古文的变形机制

蒙古文名义字符可以有多个显现字形,例如一个蒙古文字符根据其在词中的位置、词的词性和所处的音节有不同的显现形式[2]。图1显示了蒙古文字符“o”(音)在独立、词首、词中、词尾时的七种字形显现形式,字符和字形的关系不是一一对应的,但是它在Unicode编码表中只对应一个编码0x1825。此外Unicode编码表中对蒙古文的变形显现字符集没有进行编码。

图1 蒙古文字符“o”(音)的7种显现字形

蒙古文的变形规律非常复杂,并不是简单的上中下的关系,会根据其在词中位置、词性、上下文等多方因素影响变形。因此使用常规文字处理方法并不能得到正确的蒙古文文字。在Windows Vista环境中使用了OpenType字体和复杂文本引擎(Uniscribe)后支持了蒙古文的变形和竖排显示,但是QTE目前还没有支持这种功能。

3 QTE下蒙古文显示方式

3.1 蒙古文点阵字库

虽然QTE支持矢量字库,但是嵌入式系统的运行环境有限,因此使用点阵字库会得到更好的运行效果。Vista中微软提供了Mongolian baiti字体,收录了所有蒙古文的名义字符和显现字符。我们可以从中提取一个自定义蒙古文字符集,共收入255个字符,包括35个名义字符和对应的所有显现字符,并给它们分配一个系统内部码(简称内码),内码只有局部意义,因此编码可以任意分配。系统和外部交换信息时全部按标准Unicode编码进行,只有显示蒙古文时才把标准Unicode编码转换成内码,内码和Unicode之间通过算法可以互相转换,点阵字库中按内码顺序存储蒙古文字符的点阵信息。另外,由于蒙古文的字符高度不统一,因此需要每个字符的高度信息才可以正确绘制蒙古文,高度信息可以在制作蒙古文点阵时获得并存储成特定格式的文件和点阵字库一起使用[3]。

3.2 蒙古文显示原理

本文提出的蒙古文显示方法并没有使用TrueType或OpenType等矢量文字的绘制机制,而是从底层的点绘制函数开始构造自定义的蒙古文绘制函数。绘制时使用内码找到点阵信息开始位置,然后用点绘制方法绘制一个蒙古文字符。由于从底层开始绘制,因此很容易实现蒙古文字的竖排显示[4]。

但是用户输入的蒙古文或从外部得到的蒙古文都是用蒙古文Unicode编码表示的,因此再绘制蒙古文时先做预处理,把Unicode文字串变换成用内码表示的蒙古文,内码串再传输给绘制引擎进行蒙古文的显示。

3.3 QTE扩展机制

QTE采用了面向对象的编程思想,将不同的功能封装在相应的类中。QTE中有三个主要的基类:QObject、QApplication和QWidget,继承关系如图2 所示。QApplication类管理图形用户界面应用程序的控制流和主要设置。QWidget类是所有用户界面对象的基类。窗口部件是用户界面的一个原子,它从窗口系统接收鼠标、键盘和其他事件,并且在屏幕上绘制自己的表现。QTE具有很强的扩展机制,从任何一个基类开始继承后可以实现自定义类。

图2 QTE类的继承关系

3.4 自定义蒙古文显示和编辑控件

从QFrame类继承了一个新类叫做QMLabel,该类可以完成蒙古文的竖排显示。从图2可以看出QFrame是所有显示编辑类的公共基类,因此从QFrame继承是恰当的。QFrame类提供一个虚函数 drawContents,每次显示屏幕需要刷新时都被调用。因此从QFrame类继承的类必须实现自定义的drawContents函数,这给我们提供了很大的灵活性。通过该函数各类可以实现不同形状的窗口,也可以实现不同文字的绘制。drawContents函数形参是一个QPainter类,它是一个虚拟的绘画类,提供一系列绘制函数,比如drawPoint,drawLine,drawRect等等。QTE当中所有的显示控件都包含QPainter类[5]。

通过QPainter绘制蒙古文的功能可以封装的一个QMgl类,不从任何类继承,定义如下:

#include

#define DOTSIZE 32 /*点阵大小32X32*/

#define MGLCOUNT 255/*符号个数*/

class Q_EXPORT QMgl

{

public:

QMgl();

int drawChar(QPainter *p,int code,int x,int y);

/*单个符号绘制*/

bool drawString(QPainter *p,QString str,int x,

int y); /*字符串绘制*/

int getHeight(int code); /*字符高度获取*/

private:

char dianzhen[(DOTSIZE*DOTSIZE)/8*MGLCOUNT]; /*点阵信息数组*/

char charHeight[MGLCOUNT]; /*符号高度数组*/

bool openBinaryFile();/*读取点阵文件*/

bool openHeightBinaryFile();/*读取字符高度文件*/

QString mglconvert(QString str);/*蒙古文预处理函数*/

};

其中主要绘制蒙古文的函数是:

int drawChar(QPainter *p,int code,int x,int y);

P:QPainter类形参,逻辑绘制于实际的显示设备对应,提供一系列绘制函数。

Code:蒙古文内码。

x、y:逻辑画布上坐标,以像素为单位。

实现方法是通过code找到dianzhen中的起始位置,然后根据“0”或“1”判断绘制点还是不绘制。这是整个文字引擎的最底层函数,有了这个基础函数后我们就可以利用它构造功能更加强大的drawString函数,处理自动换行、手动换行、滚动等问题。 drawString函数里首先应该调用mglconvert进行蒙古文变形处理和Unicode到内码的编码转换,然后再调用drawChar进行字符的绘制。

QMLabel类的定义如下:

class QMLabel:public QFrame

{

Q_OBJECT

public:

QMLabel(QWidget * parent);

private:

QString Caption;/*显示文字*/

QMgl *mgl;

void drawContents (QPainter * p);/*实现父类的虚函数*/

};

绘制函数的实现如下:

QMLabel::drawContents( QPainter * p){

mgl->drawString(p,Caption,left,top);/*绘制蒙古文*/

}

同理可以继承一个QMEdit类,负责蒙古文的编辑功能,编辑也需要用显示功能为基础,同时处理按键和鼠标等产生的事件,实现光标、文字增删改、回车换行等功能。QTE下显示蒙古文字效果如图3。

图3 QTE 下蒙古文字的显示效果

3.5 蒙古文预处理模块实现

通过上述方法绘制蒙古文字符之前需要进行预处理,把Unicode蒙古文串转换成蒙古文内码串。预处理的基本思想是把Unicode文字串分解成一个一个Items项,每个Items可能是一个蒙古文文字,也可能是其他文字,通过Unicode编码范围判断是不是蒙古文。再把每个蒙古文的Items通过一个变换函数处理,不是蒙古文的Items则不需要处理[6]。

变换函数需要对每个蒙古文名义字符进行处理,把它变换成正确的显示形式并计算出对应的内码。变形处理时需要考虑的因素有:

(1) 字符的位置:分独立、上、中、下。

(2) 强制合体字:优先考虑能否构成强制合体字,同时考虑合体字的位置。

(3) 变形控制符:实现蒙古文编码的变形控制符使用规则[7]。

(4) 上下字符关系:蒙古文的默认规则和特殊规则的对应,主要是在一个位置有多个候选显示字时需要根据上下字符、词性、读音、特殊规则选择正确的显示字符,这需要对蒙古文的语法和构词方法进行详细的总结和统计。

4 结束语

文中提供的QTE下蒙古文显示机制是各类智能终端及便携式手持显示终端设备实现支持蒙古文显示与控制比较理想的解决方案,经过实践证明也是可行的,为进一步开发支持蒙古文的嵌入式应用产品提供了一种解决方法。

[1] 确精扎布.蒙古文编码[M].呼和浩特:内蒙古大学出版社,2000.

[2] 姚延栋,吴健,孙玉芳等.传统蒙古文变形显示机制研究与实现[J].中文信息学报,2005,18(5):84-89.

[3] S.苏雅拉图.传统蒙古文整词编码研究[J].中文信息学报, 2001,15(2):57-64.

[4] 孟凡强,吴健,贾彦民.蒙古文显示在OpenOffice.Org办公套件中的实现[J].中文信息学报,2007,21(2):117-121.

[5] 周扬荣,贾彦民.复杂文本布局引擎机制及应用研究[J].中国科学院研究生院学报,2006,23(3):390-395.

[6] 斯·劳格劳,敖其尔. Windows环境下蒙古文复杂文本处理的研究[J].内蒙古大学学报,2007,38(5):582-585.

[7] 乌达巴拉,巩政.蒙古文OpenType字体制作技术[J].内蒙古大学学报,2006,37(5):570-573.

猜你喜欢

蒙古文字符绘制
敖汉旗万寿白塔蒙古文碑文新释
基于Excel VBA和AutoCAD的滚动轴承参数化比例图绘制方法
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
超萌小鹿课程表
HBM电子称与西门子S7-200系列PLC自由口通讯
部分海外藏蒙古文文献及其目录
放学后
在转变中绘制新蓝图