>

字库移植并能显示中文,中文字体大小问题

- 编辑:正版管家婆马报彩图 -

字库移植并能显示中文,中文字体大小问题

换了市廛,想搦战一下嵌入式开拓。项目是电子书。

原文

现今的顺序只是界面,为了便利调节和测量检验,所以写代码和调节和测量试验就放到在Windows上了,方便嘛。基本分界面已经弄好,明天把程序放Linux下编写翻译,运营后粤语出现乱码。呵呵,早已驾驭会如此,日常Linux的中文内部编码是应用UTF-8,跟Windows所用的GBK是见仁见智的,QT了弹指间,就OK了。可是字体格式设置(富含大小,粗细等)都不起功能,笔者用的是QT,所以那一个设置正是QFont了,让自家怎么设置setPointSize、setBold都以无功而返!

 

独有谷歌(Google)下了,哈哈,发掘多数平等遇到的情侣,有些感到是QT的标题,有个别讲字体类型不扶植,有个别说要团结编辑字库…… 呵呵,未来自己是精晓什么样原因的,正是贫乏字库,所以编辑字库是可行的,说字体类型不支持也是没有错的,说QT的主题素材就有个别负总责了。然则难题是笔者是不容许发这么多时光去协调编辑字库啊,唉~

正文介绍的是Qt 字库移植并能呈现普通话,须要的字体库文件,平常是两个。具体移植那个,看你使用的字库是怎样了,先来看内容。

最后,看见一人老兄说把Windows下Fonts的字体类型全体拷贝到Linux下就ok了,哈,果然可以。一贯感到Windows和Linux下字库的代表格式会不均等,原本是大同小异的,还开掘字库不单单唯有ttf一种格式,还恐怕有QPF和另外的格式。好吧,未来知道板子上应有是最棒用QPF格式的字库了,因为省空间,QPF格式的字库要比ttf格式的字库小得多,但是开拓机就没那样多顾忌了,ttf就ttf,真正放板子上运转的时候,再思索QPF吧。啊,对了,忘了说Fonts是拷贝到/usr/share/fonts下,记下来是有实益的,忘了也无妨,可以来查阅:)

AD:

作者:DL

 

PS:高上次见到自个儿写的博文过了多个星期了,才多少个阅读量,非常的痛心,或者是为了增加名气吧,她对本身说:"DL,你以往也在那间发Blog吧~ 发的时候注上是您写的就好。" 作者记下了,今日终于发了,何况还签了名,哈!~

 

图片 1

解析 Qt 字库移植并能展现普通话(下篇)是本节介绍的情节,接着上篇 分析 Qt 字库移植并能展现普通话(上篇)一连介绍,烂来看本节内容。

1、两种格式字库的简要介绍

QT支撑多种格式的字库(TTF,BDF,PFA/PFB,QPF)(见参谋文献[3]),但在成品中,假诺直接运用,TTF或PFA/PFB。即让应用程序在体现的时候再总计点阵,最后的成效并不佳看,会开掘有一点字大,有个别字小,并且亟需占用相当多的FLASH和内部存储器,速度也可以有一点点慢,所以小编在这里不想过多的牵线PFA/PFB。要是直白采取BDF,速度非常的慢,并且须求占用相当多的FLASH和内部存款和储蓄器;使用QPF,速度和据有其他能源是一丝一毫的,因而大家最终的出品中央银行使QPF格式。上面笔者简要介绍,TTF,BDF和QPF字体的组织,那样就比较易于驾驭前边的转移进程。

(1)TTF字体

TTF(TrueType Font)是Apple公司和Microsoft公司联合推出的字体文件格式,随着Windows的流行,已经变为最常用的一种字体文件表示方法。TTF 字体已经成成效在Windows中文版生成汉字字库,此字体选拔三遍B样条曲线来说述字符轮廓,对字符概略的上的点,按顺时针方向从小到大编号,填充部分在其右臂。TTF文件结构分为五个部分:文件名(12Bytes),描述表目录(每种16Bytes),描述表数据。

对此每一个字,都有八个假想的矩形框,寻常情形字是不会超过那几个矩形框的,汉语属于象形字,不象菲律宾语,大小分裂样,比方:保Gary士满语中的f就大概会压倒矩形框。微软把矩形的可观称为EM,实际字符的冲天称为BODY.矩形框最原始的坐标系是矩形的主干为原点,但为了实际字体在打字与印刷和呈现的施用进程中的方便,平常将坐标原点放在左下角,或中下。

平日,在实质上打字与印刷进度中,TTF字体是用像平昔衡量的,怎么着将矩形框中的字体转成像素呢?有三个总结公式,实例如下:即便十八个点的72点每英寸屏下有多个550的长度,矩形框内有20四十七个单位。那其像素为550*18*72/72/2048=4.83像素。显著,每英寸里的点取的越来越多,字就越逼真,相同的时间那样的囤积空间和计算的年月也就越来越多。在停放程序开辟进度中,那往往是不得以承受的,因为嵌入式系统的硬件能源本来就很简单,假设真的那样的话,在浮现进度会异常慢。並且只要为了增强速度而减去每英寸中的点数,则字体失真的动静很严重。越发切实的关于,TTF字体的剧情可以知道参谋资料[3]。

别的,在Windows下编制程序,Microsoft达成了让用户对字体操作管理具有透明性,有关字体结构定义见仿效文献[4]。

(2)BDF字体

BDF(Bitmap Distribution Format)是在X窗口系统中的一种表示位图字体的文件格式。是X组织定义的一种标准,是ASCII文件它由两局地构成,一是代表字体全体性能的公文头新闻;二是每一个字符独有的性质和位图数据。小编以16*16的位图字体为例描述BDF字体文件格式。

  1. STARTFONT2.1 /*末端跟二个本子号,提议该字体文件版本*/  
  2. COMMENT /*表示注释*/  
  3. FONT -adobe -courier -bold -r -normal -16 -160 -75 -75 -m -160 -gb2312.1980 -0   
  4. /*意味着字体名*/  
  5. SIZE 16 75 75 /*字符大小与在X,Y方向上的分辨率*/  
  6. FONTBOUNDINGBOX 16 16 0 0 /*X方向上大幅与Y方向中度及x和Y方向上的撼动*/  
  7. STARTPROPERTIES 16 /*安装字体的属性项目数*/  
  8. FOUNDRY "Adobe" /*字体的创设商家*/  
  9. FAMILY_NAME "Courier" /*字体的变种字型*/  
  10. WEIGHT_NAME "Bold" /*字体的印刷权*/  
  11. SLANT "R" /*字体字型的设计意况*/  
  12. SEWINDTH_NAME "Normal" /*字体的缩放因素*/  
  13. ADD_STYLE_NAME "" /*独一的标志该字体,日常为空*/  
  14. PIXEL_SIZE 16 /*依傍于设备的书体尺寸*/  
  15. POINT_SIZE 160 /*规划字体的骨子里尺寸*/  
  16. RESOLUTION_X 75 /*设计字体的水准分辨率*/  
  17. RESOLUTION_Y 75 /*规划字体的垂直分辨率*/  
  18. SPACING "m" /*提议字符宽度是定长依然可变*/  
  19. AVERAGE_WIDTH 160 /*字体中具有字符的平分增加率*/  
  20. CHARSET_REGISTRY "gb2312.1980" /*字符集名*/  
  21. CHARSET_ENCODING "0" /*字符集编号*/  
  22. FONT_DESCENT 0 /*基线下的万丈*/  
  23. FONT_ASCENT 16 /*基线上的莫斯科大学*/  
  24. ENDPROPERTIES /*性子项设置完结*/  
  25. CHAR 6775 /*字体文件中的字符数*/  
  26. STARTCHAR 啊 /*字符开头标记及称谓*/  
  27. ENCODE 3021 /*X服务器在存取该字符时使用的编码。如汉字国家标准码*/  
  28. SWIDTH 1000 0 /*X和Y方向上的逻辑宽度和高度*/  
  29. DWIDTH 16 0 /*字符在x和Y方向上的道具单位宽度*/  
  30. BBX 16 16 0 0 /*字符边界框的增长幅度,中度以至偏移*/  
  31. BITMAP /*字符的位图的音信开端标识*/  
  32. 0000 /*字符位图*/  
  33. 04a0  
  34. ……  
  35. 0590  
  36. ENDCHAR /*字符结束标记*/  
  37. STARTCHAR 阿 /*第二个字符早先*/  
  38. ……  
  39. ENDFONT /*BDF字体文件截至标识*/ 

(3) QPF字体简介

QPF格式的字库是仅用于QT/Embedded的不可缩放的书体,在程序运维进程中,对TTF格式的书体,在首先次装入使用时,都要以给定的字体大小举办拍卖;而对于BDF字体,当其利用时,全体字体都无法不被管理;而对此QPF字体,均以同样格式的积攒。所以在字体突显时,Qt一旦读取字体,做相应分析,然后展现就成功了,那样进一步缩减了对RAM能源的浪费。QPF字体是基于UNICODE编码的,那为QT/Embedded优秀的可移植性奠定了根基。有关QPF更详尽的素材能够查阅参考文献[5]。

2、怎么样从TTF字体文件转成QPF字体文件

(1)把TTF转换成BDF

就算不引进应用TTF格式的字库,但由于TTF格式的字库能够调换到任意大小的BDF字库,而能够找到的BDF字库都是原则性大小的,因而在事实上制作QPF字体文件时,仍然要求TTF格式的字库。把TTF调换到BDF的主意如下:

  1. ./ttf2bdf source.ttf -p yourSize -o destination.bdf 

即利用软件ttf2bdf能够把源文件source.ttf转变到大小为yourSize的BDF格式的文书destination.bdf。那在前后相继内部是如何贯彻将TTF转成BDF的吧?由2.2.1和2.2.2的牵线,並且查阅参照他事他说加以考察文献[3],能够通晓TTF的此中存款和储蓄结构。此中最基本的片段是 TTF文件格式中的11个字节的文书表:表目录按tag以升序排列。

  1. Type Name Description   
  2. ULONG  tag 4字节的标志   
  3. ULONG checkSum 表中的CheckSum   
  4. ULONG offset TrueType font文件的伊始偏移量Offset   
  5. ULONG length 表长  

再有一个有关Offset表的音信,富含版本号,表的多寡,查找范围。入口选用,调换范围。

因而操作文件表,将陈述表中的数据抽出来,遵照BDF字体所定义的格式写入,就足以变动对应的字体。比方,能够付出一小段c语言程序,此程序用于计算当前CheckSum的职分。

  1. ULONG  
  2. CalcTableChecksum(ULONG *Table,ULONG Length)  
  3. {  
  4. ULONG Sum = 0L;  
  5. ULONG *Endptr=Table+((Length+3)& ~3)/sizeof(ULONG);  
  6. while(Table<EndPtr)  
  7. Sum += *Table++;  
  8. return Sum;  

行使此程序能够将各样字体的新闻分别,并将各类字体消息从文件中抽取来,对种种字体进行操作。在从TTF转到BDF进度中,仅通过应用WINDOW的函数是非常不实惠的,最方便的点子是运用c语言对字体实行操作。小编在这里列出调换进度中最重视的多少个值:PIXEL_SIZE,POINT_SIZE,RESOLUTION_X,RESOLUTION_Y,FONT_DESCENT,FONT_ASCENT,SWIDTH,DWIDTH,BBX。那一个值决定着最终生成的BDF字体与TTF字体的失真度,因为TTF是可缩放的,而BDF是稳固大小的,所以在退换进程中必定会出现失真的情况。

(2)对获得的BDF文件实行调节

由于从软件xmbdfed里获得的五个字库不切合系统的渴求,因此需求手动对其开展局地调动,别的方式赢得的BDF文件不要求张开调治。

一贯从xmbdfed里获得的字库是比照GB2312-80.0张开编码的,因而首先要将其调换到相符UNICODE编码,那亟需用到自己手动写的贰个前后相继gb2unieode,把源文件拷贝到gb2unicode程序的目录下,将其名字改为hanzist24a.txt(程序的渴求,也能够不改名字而修改程序里源文件的名字再重复编写翻译),然后运营./change之后,就到位了,因为QT中因现有的转变函数能够调用,在这里笔者不想多说关于用程序调换的代码。因为有一种更简明的艺术,即在Word中张开GB字库。然后另存为UNICODE字库文件就行了。

等候该命令实施完后(注意供给的大运相比较长),对所生成的公文dest.txt实行排序,方法如下:把dest.txt的名字改为dest.bdf(只要后缀名叫bdf就行);然后运行软件xmbdfed,用其展开该文件(xmbdfed只好直接张开后缀明为bdf的公文),另存为 yourname.bdf就可以。排完序后要求手动修改管理yourname.bdf。

由地点介绍的BDF字体魄式,未来对转移得到的BDF字体文件进行如出手工业管理:先删除行表明属性默许的字符的行DEFAULT_CHA奇骏8481,因为从GB2312转变到UNICODE后,编码为8481的字符已经不设有了,假如不删除该行,运行时会出现段错误。然后删除那个存在于几个16号字库但在正儿八经GB2312中一贯不的有个别字样。标准GB231第22中学有74四十三个字模,而八个16字库有7613个字模,多出去的那有个别在用 gb2unicode调换的时候因为找不到相应的GB2312码而从未写进dest.txt的字样初阶行"STARTCHAEscort ****"。能够用xmbdfed打开,假使出错则证实还会有一部分不完整的字样,还亟需手动删除这么些不完全的字样,假使得以正确展开则证解毒标文件已是理当如此的。(24号字库不设有那些难题,由此没有必要举行本项操作。)最终从任何大小同样的.bdf文件中拷贝编码为20-7F(ASCII码)和编码为 FE54(分号;)的字样到目的文件。

(3)把TTF.BDF转换成QPF

从仿效文献[5]中能够知晓QT提供的把TTF,BDF转换到QPF的秘技有三种,一种是工具makeqpf,这些命令无论是在Pc机上依然在开辟板上都未曾遵循(不过QT的官网却实属能够的,不知情为啥,並且,亦不是各样版本的QT都有makeqpf那几个工具,还要注脚的是,文献[6]中说这一个工具是能够的,可是小编从未考试成功)。

另一种是运作应用程序时累积选项-savefonts,如在开辟板上运维应用程序的一声令下:./sulfur -qws -savefonts

若果这时系统中/usr/qt/lib/fonts目录下并未有QPF格式的字库而只有TTF或BDF格式的字库,对应的文书fontdir中只保留要转移的文本的行,QT就能在运维时首先生成QPF格式的字库。固然通过TTF字体也得以获得QPF字体,不过最棒不要这么做,因为失真太大。

小结:Qt 字库移植并能呈现普通话(下篇)的剧情到此处就介绍完了,经过小编对字库扩充上述管理后,就能够在嵌入式开拓板上出示种种字体,只要找到给定TTF或BDF的字库,若是找不到BDF字库,可以找到字库,下一场经过TTF2BDF那个顺序来获得BDF字库。这样在开辟板上得以突显小篆,石籀文等字体,何况字体呈现也很健康,不会油然则生大小差异等的难点。然而,自身感到,由于那是嵌入式开荒,存款和储蓄能源非常有限,假使能越来越将字库降低,只留下程序中所要用的方块字组成的字库就好了,那是急需下一步钻探的样子。最后希望本文能帮您消除难题。

 

本文由计算机操作发布,转载请注明来源:字库移植并能显示中文,中文字体大小问题