解決Qt中文亂碼以及漢字編碼的問題(UTF-8/GBK)——ubuntu環境設置默認是utf-8,文件編碼可使用Encodersoft批量轉換


一、Qt環境設置

文件從window上傳到Ubuntu后會顯示亂碼,原因是因為ubuntu環境設置默認是utf-8,Windows默認都是GBK.
Windows環境下,Qt Creator,菜單->工具->選項->文本編輯器->行為->文件編碼:
默認編碼:System(簡體中文windows系統默認指的是GBK編碼,即下拉框選項里的GBK/windows-936-2000/CP936/MS936/windows-936)

 

二、編碼知識科普
Qt常見的兩種編碼是:UTF-8和GBK
★UTF-8:Unicode TransformationFormat-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24為(三個字節)來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯示。如,如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。
★GBK是國家標准GB2312基礎上擴容后兼容GB2312的標准。GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,為了區分中文,將其最高位都設定成1。GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數據庫比GBD大。GBK是GB2312的擴展,除了兼容GB2312外,它還能顯示繁體中文,還有日文的假名。
★GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312 
★在簡體中文windows系統下,ANSI編碼代表GBK/GB2312編碼,ANSI通常使用0x80~0xFF范圍的2個字節來表示1個中文字符。0x00~0x7F之間的字符,依舊是1個字節代表1個字符。Unicode(UTF-16)編碼則所有字符都用2個字節表示。

 

三、編碼轉換
UTF-8與ANSI(即GBK)的互轉,可以使用EditPlus工具"文件另存為"或者Encodersoft編碼轉換工具對.cpp和.h源文件文本進行批量轉換.

 

四、Qt編碼指定
Qt需要在main()函數指定使用的字符編碼:

#include <QTextCodec>

QTextCodec *codec = QTextCodec::codecForName("GBK");//情況1

QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);

QTextCodec *codec = QTextCodec::codecForName("UTF-8");//情況2
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);

 

這里只列舉大家最常用的3個編譯器(微軟VS的中的cl,Mingw中的g++,Linux下的g++),源代碼分別采用GBK和無BOM的UTF-8以及有BOM的UTF-8這3種編碼進行保存,發生的現象如下表所示。

  • 源代碼的編碼

    編譯器

    顯示正常

    顯示亂碼

    GBK

    win vs cl

    情況1

    情況2

    win mingw-g++

    情況1

    情況2

    linux g++

    情況1

    情況2

    UTF-8(無BOM)

    win vs cl

    編譯失敗

    error C2001: 常量中有換行符

    編譯失敗
    error C2001: 常量中有換行符

    win mingw-g++

    情況2

    情況1

    linux g++

    情況2

    情況1

    UTF-8(有BOM)

    win vs cl

    情況1

    情況2

    win mingw-g++

    情況2

    情況1

    linux g++

    情況2

    情況1

 

五、應用案例
QCom跨平台串口調試助手(http://www.qter.org/?page_id=203)
源代碼qcom\mainwindow.cpp,aboutdialog.cpp等文件用的是UTF-8編碼(無BOM);但是qcom\qextserial\*.*文件用的是ANSI編碼.在linux環境編譯完全OK.
筆者Windows環境的Qt Creator+微軟VS編譯器,環境設置用的是ANSI(即GBK)編碼.編譯源文件會報錯.
錯誤提示"fatal error C1018: 意外的 #elif".


解決方法由兩種:

方法1:

把qcom\的所有文件都用工具轉換成ANSI編碼,main()函數使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

方法2:

先把Qt Creator環境設置用的是UTF-8編碼,

再把qcom\的所有文件都用工具轉換成UTF-8+BOM編碼,請注意,如果文件轉換成UTF-8(無BOM),編譯仍會失敗.main()函數使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));//注意,此處仍是"GBK",不是"UTF-8"
重新編譯,OK!

 

六、結論

Windows環境下,Qt Creator+微軟VS編譯器,新建工程,

1、如果該工程不需要跨平台使用(只在win),那么工程設置請使用GBK的編碼方式.

2、如果該工程要跨平台使用(win+linux),那么工程設置請使用UTF-8+BOM的編碼方式.

Linux環境下,Qt Creator+gcc,新建工程,

沒有GBK編碼可選,默認是UTF-8(無BOM)編碼方式,考慮到跨平台,建議選擇UTF-8+BOM的編碼方式.

 

七、參考文獻

Qt中文亂碼問題http://blog.csdn.net/brave_heart_lxl/article/details/7186631


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM