解析 Qt 字庫移植并能顯示中文 (上篇)
Qt 字庫移植并能顯示中文是本文介紹的內(nèi)容,先來看內(nèi)容,如何定制字庫(移植字庫),需要將至少兩個文件賦值到 lib/font目錄下
1、fontdir 文件。這個是應(yīng)用程序?qū)ふ耶?dāng)前系統(tǒng)中最合適自己需要的字庫的索引;
2、需要的字庫文件,一般是多個。具體移植那一個,看你使用的字庫是什么了,比如我現(xiàn)在的系統(tǒng)我就是移植的wenquanyi_12pt.bdf就可以了,當(dāng)然這個比較大。你也可以用小點(diǎn)的。我的flash比較大呵呵,懶得折騰。
在程序中需要這樣設(shè)置:
- QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
- QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
設(shè)置使用utf-8編碼也就是unicode編碼了,這樣在tr和string的都是unicode的編碼了,根據(jù)字庫的索引就能對應(yīng)相應(yīng)的字符了。
然后設(shè)置字體:
- //字體設(shè)置
- QFont font("wenquanyi",12,QFont::Bold); //使用wenquanyi字體
- this->setFont(font);
- //這樣就設(shè)置了字體了,中文一般使用wenquanyi字體就可以了。很好的。
基礎(chǔ)知識介紹:
字符編碼
1、字符必須編碼后才能被計(jì)算機(jī)處理。計(jì)算機(jī)使用的缺省編碼方式就是計(jì)算機(jī)的內(nèi)碼。早期的計(jì)算機(jī)使用7位的ASCII編碼,為了處理漢字,程序員設(shè)計(jì)了用于簡體中文的GB2312和用于繁體中文的big5。在這些編碼中,中文和英文可以統(tǒng)一的處理,區(qū)分中文編碼的方法是高字節(jié)的***位為不為0。GB內(nèi)碼的存儲方式始終都是big endian,即高位在前。
2、Unicode是一種字符編碼方法,它是由國際組織設(shè)計(jì),可以容納全世界所有語言文字的編碼方案。Unicode的學(xué)名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。UCS可以看作是"Unicode Character Set"的縮寫。
Unicode與GB碼不兼容,只與ASCII兼容。
UCS規(guī)定了怎么用多個字節(jié)表示各種文字。怎樣傳輸這些編碼,是由UTF(Unicode transforation format)規(guī)范規(guī)定的。常見的UTF規(guī)范包括UTF-8(就是以8位為單元對UCS進(jìn)行編碼)、UT F-7、UTF-16。
UTF-*和Unicode是同類,就是在編碼方式上不同。首先UTF編碼后的大小是不一定,不像Unicode編碼后的大小是一樣的。
字體庫:
一般認(rèn)為,一個漢字的編碼就對應(yīng)著這樣的字形,這還是錯誤的。內(nèi)碼對于字庫來說,只是查找字形的索引。如果換成另一個編碼標(biāo)準(zhǔn)的字體,同一個字符串就會呈現(xiàn)不同的字形,也就是亂碼。
隨著GUI的發(fā)展,字庫逐漸轉(zhuǎn)向TTF.TTF字庫的編碼標(biāo)準(zhǔn)沒有UTF8的
由于工作需要把ttf字體轉(zhuǎn)換成qpf字體,牽扯到了qt的makeqpf工具的使用方法
先簡單說一下qt的字體支持
Qte可以支持以下四種形態(tài)的字體格式
- TrueType (TTF)、Postscript Type(PFA/PFB)、Bitmap Distribution Format fonts(BDF)、Qt Prerendered Font(QPF)
Qt中不同字體是用Unicode來處理、轉(zhuǎn)換
因?yàn)閁nicode(UTF16或者UTF8)最適合在任何人之間傳遞信息,
至于TrueType(不知道是什么東西,先唬著?)的支援,目前Qte采用的是FreeType2 Livrary來顯示字體,可充分享受無段式anti-aliased顯示。
經(jīng)過下午的查證:Truetype是由AppleComputer公司和Microsoft公司聯(lián)合提出的一種新型數(shù)學(xué)字形描述技術(shù)。他用數(shù)學(xué)函數(shù)描述字體輪廓外形,含有字形構(gòu)造、顏色填充、數(shù)字描述函數(shù)、流程條件控制、珊格處理控制、附加提示控制等指令。TrueType采用幾何學(xué)中二次B樣條曲線及直線來描述字體的外形輪廓,其特點(diǎn)是:TrueType即可以作打印字體又可以做屏幕顯示;由于它是由指令對字形進(jìn)行描述,因此它與分辨率無關(guān),輸出時總是按照打印機(jī)的分辨率輸出。無論放大或縮小,字符總是光滑的,不會有鋸齒出現(xiàn)。但相對PostScript字體來說,其質(zhì)量要差一些,特別是在文字太小時,就表現(xiàn)得不是很清楚
簡單 一下:truetype,字體就是可以不變形放大的字體,標(biāo)準(zhǔn)的字體大約有三種。*.fon 、*.ttf 、*.ttc,你所問的就是*.ttf 、*.ttc是*.ttf的新標(biāo)準(zhǔn)。*.fon就是很久以前用的字體,dos下現(xiàn)windows還有少量,主要用在系統(tǒng)使用方面可以提高程序的執(zhí)行效率
FreeType是一個免費(fèi)的并且可以被移植的TrueType 字庫引擎,可以應(yīng)用于很多平臺!
fontdir的簡介
下面是截取qtcore中默認(rèn)的fontdir文件中的中文字庫部分
- #Chinese character font from http://wqy.sourceforge.net/en
- wenquanyi wenquanyi_12pt.bdf BDF n 50 120 u
- wenquanyi wenquanyi_13pt.bdf BDF n 50 130 u
- wenquanyi wenquanyi_15pt.bdf BDF n 50 150 u
- wenquanyi wenquanyi_16pt.bdf BDF n 50 160 u
- wenquanyi wenquanyi_12ptb.bdf BDF n 75 120 u
- wenquanyi wenquanyi_13ptb.bdf BDF n 75 130 u
- wenquanyi wenquanyi_15ptb.bdf BDF n 75 150 u
- wenquanyi wenquanyi_16ptb.bdf BDF n 75 160 u
可以看到共有七列
- ***列:字體的名字,就是你在設(shè)置字體的時候的字體的名字
- 第二列: (file)即具體的文件名字
- 第三列: (renderer)字體的格式,有BDF,TTT,QPF等選擇.
- 第四列: n 表示iitalic,是否為斜體
- 第五列:weight, 50 = Nomal,75=Bold
- 第六列: size 120表示12pt
- 第七列flags 有三個選項(xiàng):s (smooth)
- u (unicode順序保存)
- a (ascii 順序保存,默認(rèn)是Latin 1)。
文件中每行都標(biāo)識一個特定的字庫,每個段的含義是:***列為name,第二列為file,第三列為renderer,相當(dāng)于字型格式,所以有 BDF,TTT,QPF等選擇。第四列n表示iitalic,表示是否為斜體字。第五列表示weight,其中50表示Normal,75表示Bold。第六列表示size,例如:120表示12pt。第七列為flags,有下面三個選擇:s=smooth(anti-aliased)u =unicode range when saving (default is Latin 1 a = ASCII range when saving(default is Latin 1))
其中屬性file,renderer(BDF,TTF,QPF)和size特別要設(shè)置對,其它屬性問題不大。還要注意如果在該目錄下有QPF的文件,系統(tǒng)只會使用QPF格式的文件,而不會讀取其它格式的文件,不管FONTDIR里面的內(nèi)容是什么。如果有多個QPF文件,應(yīng)用程序按照大小,家族,黑體和斜體的順序查找,即首先查找大小和自己一樣的字庫,大小無法區(qū)分唯一的字庫的再看對應(yīng)的家族,還是無法區(qū)分的再看是否黑體,是否斜體??梢詤⒖糚C上的字庫索引文件FONTDIR:
例如:
- -cclib -song -medium -r -normal -jiantizi -16 -160 -75 -75 -c -160 -gb2312 1980-0
其中,每個段的含義如下:
- cclib:制造商
- song:字體族,此處表示“宋體”字
- medium:字權(quán)重(中等),還有bold(粗體)選項(xiàng)
- r:傾斜,R(Roman),I(Italic),O(Oblique)
- normal:字符集寬度,此外還有condensed,narrow,double
- jiantizi:附加說明(此處意義為“簡體字”)
- 16:用像素衡量的寬度。
- 160:點(diǎn)數(shù) 10
- 75(1):水平分辨率(dpi)
- 75(2):垂直分辨率(dpi)
- c:間距。c:square,m:fixed width,p:variable width
- 160:平均寬度(10*pixels)
- gb2312.1980:注冊字符集,標(biāo)準(zhǔn)名
小結(jié):解析 Qt 字庫移植并能顯示中文 (上篇)的內(nèi)容介紹完了,希望本文對你有所幫助,想要深入了解,請參考 解析 Qt 字庫移植并能顯示中文 (下篇)。