Qt字库的移植使其很好的显示中文 一.docx

上传人:b****8 文档编号:11074928 上传时间:2023-02-24 格式:DOCX 页数:12 大小:22.45KB
下载 相关 举报
Qt字库的移植使其很好的显示中文 一.docx_第1页
第1页 / 共12页
Qt字库的移植使其很好的显示中文 一.docx_第2页
第2页 / 共12页
Qt字库的移植使其很好的显示中文 一.docx_第3页
第3页 / 共12页
Qt字库的移植使其很好的显示中文 一.docx_第4页
第4页 / 共12页
Qt字库的移植使其很好的显示中文 一.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Qt字库的移植使其很好的显示中文 一.docx

《Qt字库的移植使其很好的显示中文 一.docx》由会员分享,可在线阅读,更多相关《Qt字库的移植使其很好的显示中文 一.docx(12页珍藏版)》请在冰豆网上搜索。

Qt字库的移植使其很好的显示中文 一.docx

Qt字库的移植使其很好的显示中文一

Qt字库的移植(使其很好的显示中文)一

qt字库的移植(使其很好的显示中文)

1如何定制字库(移植字库)

需要将至少两个文件赋值到....lib/font目录下1.fontdir文件。

这个是应用程序寻找当前系统中最合适自己需要的字库的索引;2,需要的字体库文件,一般是多个。

具体移植那一个,看你使用的字库是什么了,。

比如我现在的系统我就是移植的wenquanyi_12pt.bdf就可以了,当然这个比较大。

你也可以用小点的。

我的flash比较大呵呵,懒得折腾。

在程序中需要这样设置:

QTextCodec:

:

setCodecForTr(QTextCodec:

:

codecForName("utf8"));

QTextCodec:

:

setCodecForCStrings(QTextCodec:

:

codecForName("utf8"));

设置使用utf-8编码也就是unicode编码了,这样在tr和string的都是unicode的编码了,根据字库的索引就能对应相应的字符了。

然后设置字体:

//字体设置

QFontfont("wenquanyi",12,QFont:

:

Bold);//使用wenquanyi字体

this->setFont(font);

//这样就设置了字体了,中文一般使用wenquanyi字体就可以了。

很好的。

基础知识介绍:

字符编码

1、

符必须编码后才能被计算机处理。

计算机使用的缺省编码方式就是计算机的内码。

早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体

中文的GB2312和用于繁体中文的big5。

在这些编码中,中文和英文可以统一的处理,区分中文编码的方法是高字节的最高位为不为0。

GB内码的存储方

式始终都是bigendian,即高位在前。

2、

Unicode是一种字符编码方法,它是由国际组织设计,可以容纳全世界所有

语言文字的编码方案。

Unicode的学名是"UniversalMultiple-OctetCodedCharacter

Set",简称为UCS。

UCS可以看作是"UnicodeCharacterSet"的缩写。

Unicode与GB码不兼容,只与ASCII兼容。

UCS规定了怎么用多个字节表示各种文字。

怎样传输这些编码,是由UTF(Unicodetransforationformat)规范规定的。

常见的UTF规范包括UTF-8(就是以8位为单元对UCS进行编码)、UTF-7、UTF-16。

UTF-*和Unicode是同类,就是在编码方式上不同。

首先UTF编码后的大小是不一定,不像Unicode编码后的大小是一样的。

字体库:

一般认为,一个汉字的编码就对应着这样的字形,这还是错误的。

内码对于字库来说,只是查找字形的索引。

如果换成另一个编码标准的字体,同一个字符串就会呈现不同的字形,也就是乱码。

随着GUI的发展,字库逐渐转向TTF.TTF字库的编码标准没有UTF8的

由于工作需要把ttf字体转换成qpf字体,牵扯到了qt的makeqpf工具的使用方法

先简单说一下qt的字体支持

Qte可以支持以下四种形态的字体格式

TrueType(TTF)、PostscriptType(PFA/PFB)、BitmapDistributionFormatfonts(BDF)、QtPrerenderedFont(QPF)

Qt中不同字体是用Unicode来处理、转换

因为Unic

ode(UTF16或者UTF8)最适合在任何人之间传递信息,

至于TrueType(不知道是什么东西,先唬着)的支援,目前Qte采用的是FreeType2Livrary来显示字体,可充分享受无段式anti-aliased显示。

过下午的查证:

Truetype是由AppleComputer公司和Microsoft公司联合提出的一种新型数学字形描述技术。

他用数学函数描述字体

轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、珊格处理控制、附加提示控制等指令。

TrueType采用几何学中二次B样条曲线及直线

来描述字体的外形轮廓,其特点是:

TrueType即可以作打印字体又可以做屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按

照打印机的分辨率输出。

无论放大或缩小,字符总是光滑的,不会有锯齿出现。

但相对PostScript字体来说,其质量要差一些,特别是在文字太小时,就

表现得不是很清楚

简单一下:

truetype,字体就是可以不变形放大的字体,标准的字体大约有三种。

*.fon、*.ttf

、*.ttc,你所问的就是*.ttf

、*.ttc是*.ttf的新标准。

*.fon就是很久以前用的字体,dos下现windows还有少量,主要用在系统使用方面可以提高程序的执行效率

FreeType是一个免费的并且可以被移植的TrueType字库引擎,可以应用于很多平台!

fontdir的简介下面是截取qtcore中默认的fontdir文件中的中文字库部分#Chinesecharacterfontfromwenquanyi_12pt.bdfBDFn50120uwenquanyiwenquanyi_13pt.bdfBDFn50130uwenquanyiwenquanyi_15pt.bdfBDFn50150uwenquanyiwenquanyi_16pt.bdfBDFn50160uwenquanyiwenquanyi_12ptb.bdfBDFn75120uwenquanyiwenquanyi_13ptb.bdfBDFn75130uwenquanyiwenquanyi_15ptb.bdfBDFn75150uwenquanyiwenquanyi_16ptb.bdfBDFn75160u可以看到共有七列

第一列:

字体的名字,就是你在设置字体的时候的字体的名字

第二列:

(file)即具体的文件名字

第三列:

(renderer)字体的格式,有BDF,TTT,QPF等选择.

第四列:

n表示iitalic,是否为斜体

第五列:

weight,50=Nomal,75=Bold

第六列:

size120表示12pt

第七列flags有三个选项:

s(smooth)

u(unicode顺序保存)

a(ascii顺序保存,默认是Latin1)。

文件中每行都标识一个特定的字库,每个段的含义是:

第一列为name,第二列为file,第三列为renderer,相当于字型格式,所以有

BDF,TTT,QPF等选择。

第四列n表示iitalic,表示是否为斜体字。

第五列表示weight,其中50表示Normal,75表示Bold。

第六列表示size,例如:

120表示12pt。

第七列为flags,有下面三个选择:

s=smooth(anti-aliased)u

=unicoderangewhensaving(defaultisLatin1a=ASCIIrangewhen

saving(defaultisLatin1))

 

——摘自参考文献[1]

其中属性file,renderer(BDF,TTF,QPF)和size特别要设置对,其它属性问题不大。

还要注意如果在该目录下有QPF的文件,系统

只会使用QPF格式的文件,而不会读取其它格式的文件,不管FONTDIR里面的内容是什么。

如果有多个QPF文件,应用程序按照大小,家族,黑体和斜体

的顺序查找,即首先查找大小和自己一样的字库,大小无法区分唯一的字库的再看对应的家族,还是无法区分的再看是否黑体,是否斜体。

可以参考PC上的字库索

引文件FONTDIR:

例如:

-cclib-song-medium-r-normal-jiantizi-16-160-75-75-c-160-gb23121980-0

其中,每个段的含义如下:

cclib:

制造商

song:

字体族,此处表示“宋体”字

medium:

字权重(中等),还有bold(粗体)选项

r:

倾斜,R(Roman),I(Italic),O(Oblique)

normal:

字符集宽度,此外还有condensed,narrow,double

jiantizi:

附加说明(此处意义为“简体字”)

16:

用像素衡量的宽度。

160:

点数10

75

(1):

水平分辨率(dpi)

75

(2):

垂直分辨率(dpi)

c:

间距。

c:

square,m:

fixedwidth,p:

variablewidth

160:

平均宽度(10*pixels)

gb2312.1980:

注册字符集,标准名

0:

第0套,基本集

——摘自参考文献[2]

1.2几种格式字库的简介

QT支持四种格式的字库(TTF,BDF,PFA/PFB,QPF)(见参考文献[3]),但在产品中,如果直接使用,TTF或PFA/PFB。

即让应用

程序在显示的时候再计算点阵,最终的效果并不理想,会发现有些字大,有些字小,而且需要占用非常多的FLASH和内存,速度也有点慢,所以我在此不想过多

的介绍PFA/PFB。

如果直接使用BDF,速度非常慢,而且需要占用比较多的FLASH和内存;使用QPF,速度和占用其它资源是最小的,因此我们最终

的产品中采用QPF格式。

下面我简单介绍,TTF,BDF和QPF字体的结构,这样就比较容易理解后面的转换过程。

1.2.1TTF字体

TTF(TrueType

Font)是Apple公司和Microsoft公司共同推出的字体文件格式,随着Windows的流行,已经变成最常用的一种字体文件表示方式。

TTF

字体已经成功用在Windows中文版生成汉字字库,此字体采用二次B样条曲线来描述字符轮廓,对字符轮廓的上的点,按顺时针方向从小到大编号,填充部分

在其右边。

TTF文件结构分成三个部分:

文件名(12Bytes),描述表目录(每个16Bytes),描述表数据。

对于每一个字,都有一个假想的矩形框,正常情况字是不会超出这个矩形框的,中文属于象形字,不象英文,大小不一致,比如:

英文中的f就可能会超出矩形框。

微软把矩形的高度称为EM,实际字符的高度称为BODY.矩形框最

原始的坐标系是矩形的中心为原点,但为了实际字体在打印和显示的使用过程中的方便,通常

将坐标原点放在左下角,或中下。

通常,在实际打印过程中,TTF字体是用像素来度量的,如何将矩形框中的字体转成像素呢?

有一个计算公式,实例如下:

如果18个点的72点每英寸屏下有一

个550的长度,矩形框内有2048个单位。

那其像素为550*18*72/72/2048=4.83像素。

显然,每英寸里的点取的越多,字就越逼真,同

时这样的存储空间和计算的时间也就越多。

在嵌入程序开发过程中,这往往是不可以接受的,因为嵌入式系统的硬件资源本来就很有限,如果真的这样的话,在显示

过程会很慢。

并且如果为了提高速度而减少每英寸中的点数,则字体失真的情况很严重。

更加具体的关于,TTF字体的内容可见参考资料[3]。

另外,在Windows下编程,Microsoft实现了让用户对字体操作处理具有透明性,有关字体结构定义见参考文献[4]。

1.2.2BDF字体

BDF(BitmapDistribution

Format)是在X窗口系统中的一种表示位图字体的文件格式。

是X协会定义的一种标准,是ASCII文件

它由两部分组成,一是表示字体整体属性的文件头信息;二是每一个字符独有的属性和位图数据。

我以16*16的位图字体为例描述BDF字体文件格式。

STARTFONT2.1/*后面跟一个版本号,指出该字体文件版本*/

COMMENT/*表示注释*/

FONT-adobe-courier-bold-r-normal-16-160-75-75-m-160-gb2312.1980-0

/*表示字体名*/

SIZE167575/*字符大小与在X,Y方向上的分辨率*/

FONTBOUNDINGBOX161600/*X方向上宽度与Y方向高度及x和Y方向上的偏移*/

STARTPROPERTIES16/*设置字体的属性项目数*/

FOUNDRY"Adobe"/*字体的制造厂家*/

FAMILY_NAME"Courier"/*字体的变种字型*/

WEIGHT_NAME"Bold"/*字体的印刷权*/

SLANT"R"/*字体字型的设计情况*/

SEWINDTH_NAME"Normal"/*字体的缩放因素*/

ADD_STYLE_NAME""/*唯一的标识该字体,一般为空*/

PIXEL_SIZE16/*依赖于设备的字体尺寸*/

POINT_SIZE160/*设计字体的实际尺寸*/

RESOLUTION_X75/*设计字体的水平分辨率*/

RESOLUTION_Y75/*设计字体的垂直分辨率*/

SPACING"m"/*指出字符宽度是定长还是可变*/

AVERAGE_WIDTH160/*字体中所有字符的平均宽度*/

CHARSET_REGISTRY"gb2312.1980"/*字符集名*/

CHARSET_ENCODING"0"/*字符集编号*/

FONT_DESCENT0/*基线下的高度*/

FONT_ASCENT16/*基线上的高度*/

ENDPROPERTIES/*属性项设置结束*/

CHAR6775/*字体文件中的字符数*/

STARTCHAR啊/*字符起始标志及名称*/

ENCODE3021/*X服务器在存取该字符时使用的编码。

如汉字国标码*/

SWIDTH10000/*X和Y方向上的逻辑宽度和高度*/

DWIDTH160/*字符在x和Y方向上的设备单位宽度*/

BBX161600/*字符边

界框的宽度,高度以及偏移*/

BITMAP/*字符的位图的信息起始标志*/

0000/*字符位图*/

04a0

……

0590

ENDCHAR/*字符结束标志*/

STARTCHAR阿/*第二个字符开始*/

……

ENDFONT/*BDF字体文件结束标志*/

1.2.3QPF字体简介

QPF格式的字库是仅用于QT/Embedded的不可缩放的字体,在程序运行过程中,对TTF格式的字体,在第一次装入使用时,都要以给定的字体大小进

行处理;而对于BDF字体,当其使用时,所有字体都必须被处理;而对于QPF字体,均以相同格式的存储。

所以在字体显示时,Qt只要读取字体,做相应分

析,然后显示就完成了,这样进一步减少了对RAM资源的浪费。

QPF字体是基于UNICODE编码的,这为QT/Embedded良好的可移植性奠定了基

础。

有关QPF更详细的资料可以查阅参考文献[5]。

2如何从TTF字体文件转成QPF字体文件

2.1把TTF转换成BDF

尽管不推荐使用TTF格式的字库,但由于TTF格式的字库可以转换成任意大小的BDF字库,而可以找到的BDF字库都是固定大小的,因此在实际制作QPF字体文件时,还是需要TTF格式的字库。

把TTF转换成BDF的方法如下:

./ttf2bdfsource.ttf-pyourSize-odestination.bdf

即利用软件ttf2bdf可以把源文件source.ttf转换成大小为yourSize的BDF格式的文件destination.bdf。

那在程序内

部是如何实现将TTF转成BDF的呢?

由2.2.1和2.2.2的介绍,并且查阅参考文献[3],可以知道TTF的内部存储结构。

其中最核心的部分是

TTF文件格式中的12个字节的文件表:

表目录按tag以升序排列。

Type

Name

Description

ULONG

tag

4字节的标识

ULONG

checkSum

表中的CheckSum

ULONG

offset

TrueTypefont文件的起始偏移量Offset

ULONG

length

表长

还有一个有关Offset表的信息,包括版本号,表的数量,查找范围。

入口选择,转换范围。

通过操作文件表,将描述表中的数据取出来,按照BDF字体所定义的格式写入,就可以生成对应的字体。

比如,可以给出一小段c语言程序,此程序用于计算当前CheckSum的位置。

ULONG

CalcTableChecksum(ULONG*Table,ULONGLength)

{

ULONGSum=0L;

ULONG*Endptr=Table+((Length+3)&~3)/sizeof(ULONG);

while(Table3总结

经过本人对字库进行上述处理后,就可以在嵌入式开发板上显示各种字体,只要找到给定TTF或BDF的字库,如果找不到BDF字库,可以找到字库,然后通过

TTF2BDF这个程序来得到BDF字库。

这样在开发板上可以显示行书,楷书等字体,并且字体显示也很正常,不会出现大小不一致的问题。

但是,本人认为,

由于这是嵌入式开发,存储资源非常有限,如果能进一步将字库缩小,只留下程序中所要用的汉字组成的字库就好了,这是需要下一步研究的方向。

参考文献:

[1]

http:

//jserv.

Sayya.org/qtopia/doe/qte.txt

[2]

http:

//www.Linuxfans.org/nuke/modules.php?

name=Forums&file

=viewtopic&t=82950&highlight=fonts.dir

[3]MicrosoftCorporation.TTFTechnicalSpecificationRevision1.66November1995.

[4]Windows2000编程核心技术精解[M].中国水利水电出版社,2001.

[5]

http:

//doc.T

[6]黄敬群.Qt/Embedded中文处理实战[M]

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1