1. 程式人生 > >Qt學習之路【1】:QT顯示中文問題

Qt學習之路【1】:QT顯示中文問題

最近,公司專案的GUI介面使用的是Qt,研究了近兩個月的Qt發現中文顯示確實是一個問題,這個問題中主要存在兩方面的問題:

【1】中文顯示;

【2】中文亂碼;

其中【1】問題出現的情景是:Qt的介面只有英文字母,中文一個都不顯示,也不會出現亂碼;【2】問題出現的情景是:Qt介面本來顯示漢字的地方全部被亂碼所代替。

【1】問題產生的原因是:Qt字型檔中沒有相應的字型,提供給Qt的介面

【2】問題產生的原因是:中文編碼轉換的問題。

位元組順序標記(BOM)

出現在位元組流的開頭,在windows下儲存UTF-8編碼的檔案時,會在開始的地方插入 BOM(0xEF,0xBB,0xBF),讓編輯器識別檔案是否為UTF-8編碼。而標準的UFT-8是不帶BOM的。也就是說,如果再Linux系統下,檔案編碼格式可以忽略BOM。。
注意:在Qtcreator(Linux平臺下)中的“Tool”->"Options"下設定“UTF-8 BOM”時不要選擇“Add If Encoding Is UTF-8“,如果選擇這一項,在寫程式碼的時候會新增BOM,而這樣在編譯的時候就會報錯。

幾種編碼格式

UTF-8

Unicode TransformationFormat-8bit,允許含BOM,但標準的UTF-8不含BOM,用來統一國際上的字元,通用性強,屬於國際編碼,它對英文使用8位(即一個位元組),中文使用24為(三個位元組)來編碼。UTF-8編碼的文字可以在各國支援UTF8字符集的瀏覽器上顯示。如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支援包。

GBK /GB2312

GBK是國家標準GB2312基礎上擴容後相容GB2312的標準。GBK的文字編碼是用雙位元組來表示的,即不論中、英文字元均使用雙位元組來表示,為了區分中文,將其最高位都設定成1。GBK包含全部中文字元,是國家編碼,通用性比UTF8差。

Unicode

Unicode中儲存了很多種編碼的字元,它可以看做是很多種編碼格式的集合。

亂碼產生的原因

檔案的編碼格式有多種,因此同一的二進位制檔案可以被翻譯成不同的符號。那麼當一個檔案用這種編碼方式編輯但是卻使用另一中編碼方式開啟的時候,就會出現亂碼,而產生亂碼的原因就是兩種編碼格式的字元的儲存方式是不同的。 那麼在Qt中出現亂碼是怎麼回事呢?
Linux平臺下的Qtcreator的編碼格式是UTF-8,中文使用三個位元組來編碼;而Qt中的QString使用Unicode來編碼的。Unicode中有很多種編碼格式的字元。那麼當把一串中文賦值給QString定義的變數A時,就會存在一個問題,這串文字是以一種什麼樣的編碼儲存到Unicode中的?如果是以UTF-8的方式儲存的,那麼Qt上的字型就會顯示正常;如果是以其他的編碼方式儲存的則會出現亂碼。 在Qt程式中,如果不指明使用哪種編碼儲存到Unicode,那麼會預設Latin-1編碼,這樣在Qt顯示中文的時候就會出現亂碼!
因此當在程式中貼上上圖的幾行程式碼時,其作用就是指明程式中的中文使用哪種編碼儲存到Unicode中

QT(桌面)中文顯示以及亂碼解決

自己的Qt中沒有對應的漢字型檔,以至於沒法顯示中文,原因是開始在編譯Qt時沒有加上下面的引數
解決方法:重新編譯Qt庫
配置:./configure  -fontconfig
編譯:make
安裝:make install
測試:重新編譯完成後,進入到Qt安裝目錄下的bin目錄下,執行./qtconfig,在出現的介面中選擇font,字型出現wenquan***的字型,說明安裝成功。然後設定了這個字型,中文就顯示出來了

至於亂碼,則貼上上圖的程式碼就可以了。

QT(嵌入式)中文顯示以及亂碼解決

我遇到的主要是中文顯示的問題,剛開始開發板的螢幕上沒有一個漢字,亂碼也沒有。我就知道是字型檔的問題。下載了文泉驛的字型放到了../font資料夾下面也不行(此資料夾下有好多的字型),最後將此資料夾下的字型刪除至只剩下一種,文字就顯示出來了。經過一步步測試,最終找到原因:沒有設定使用哪種字型。因為這個程式是以前公司的人寫的,讓我除錯Bug,坑人。那麼為什麼程式沒有確定選擇使用哪種字型時,只有一種字型就會顯示中文,而多種字型之後就不會顯示字型呢? 這個問題我沒有去找答案。可能是因為是:多種字型的時候,程式無法確定使用哪種字型的緣故吧。

參考資料:

百度百科:http://baike.baidu.com/subview/126558/5073178.htm
字元常見的幾種編碼方式:http://blog.csdn.net/csywwx2008/article/details/17137097
qt中文亂碼問題:http://blog.csdn.net/brave_heart_lxl/article/details/7186631
(原創)QT 4.7支援中文(QT4.7)(中文)(makeqpf)http://www.cnblogs.com/liu_xf/archive/2011/07/05/2098144.html