1、Qt環境設置linux
文件從window上傳到Ubuntu後會顯示亂碼,緣由是由於ubuntu環境設置默認是utf-8,Windows默認都是GBK.
Windows環境下,Qt Creator,菜單->工具->選項->文本編輯器->行爲->文件編碼:
默認編碼:System(簡體中文windows系統默認指的是GBK編碼,即下拉框選項裏的GBK/windows-936-2000/CP936/MS936/windows-936)數據庫
2、編碼知識科普
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個字節表示。ubuntu
3、編碼轉換
UTF-8與ANSI(即GBK)的互轉,可使用EditPlus工具"文件另存爲"或者Encodersoft編碼轉換工具對.cpp和.h源文件文本進行批量轉換.windows
4、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);spa
這裏只列舉你們最經常使用的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 |
5、應用案例
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!
6、結論
Windows環境下,Qt Creator+微軟VS編譯器,新建工程,
一、若是該工程不須要跨平臺使用(只在win),那麼工程設置請使用GBK的編碼方式.
二、若是該工程要跨平臺使用(win+linux),那麼工程設置請使用UTF-8+BOM的編碼方式.
Linux環境下,Qt Creator+gcc,新建工程,
沒有GBK編碼可選,默認是UTF-8(無BOM)編碼方式,考慮到跨平臺,建議選擇UTF-8+BOM的編碼方式.
7、參考文獻
Qt中文亂碼問題http://blog.csdn.net/brave_heart_lxl/article/details/7186631