一、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
