在使用 Qt5
進行開發的過程當中遇到了一些跨平臺的中文編碼轉換問題,而後進行了一番調查,這裏作個總結,但願能幫上他人linux
首先咱們認識一下 UNICODE, UNICODE 是由微軟等多個知名公司發佈的一種字符集標準,具體編碼實現有 UTF-8, UTF-16 和 UTF-32 這三種編碼格式。而GBK字符編碼屬於另外一套字符集,相似的還有Big5字符集。編程
而後介紹一下 UCS ,UCS 是 ISO 組織發佈的一種相似 UNICODE 的字符集標準,後來二者開始合流,編碼基本一致。這裏須要知道的是 UCS-2 和 UTF-16 之間的關係,UCS-2 規範至關於 UTF-16 規範的 子集,由於 UTF-16 有擴展字符爲變長,而 UCS-2 是固定兩個字節windows
windows 自從 windows 2000 後 就開始使用 UNICODE 字符集,具體編碼是 UTF-16 編碼。而後從 vista 以後開始支持 UNICODE 5.0 標準,對 UTF-16 的支持也更加完善,支持 UTF-16 surrogate 擴展字符的顯示。對於windows的開發人員而言,咱們須要知道 windows 上具體表明 UTF-16 編碼的數據類型,這裏以 visual studio 系列 IDE 和所帶的編譯器爲例,Qt這裏也使用了 msvc 編譯器環境函數
UTF-16
的數據類型是 wchar_t
,也就是咱們工程設置選擇的寬字符。可能有人會問,UTF-16 是變長編碼,擴展編碼會用到4個字節,wchar_t 怎麼表示?遺憾的是的確無法表示,這更像是 UCS-2
標準,可是咱們須要知道的是 windows 的內核的確是 UTF-16 的,只是編程接口只提供了兩字節的 wchar_t。不過這些擴展字符基本用不到,因此咱們不用過多考慮,若是你須要瞭解更多能夠自行查閱資料,博主暫時未深刻#if defined(_MSC_VER) && (_MSC_VER >= 1600) # pragma execution_character_set("utf-8") #endif
注意:文件格式使用 UTF-8 可能出現 "error C2001: 常量中有換行符" 的狀況,這時候能夠改文件格式爲 UTF-8 BOM 來解決問題。實際上還有一些其餘的解決方案,你們能夠自行搜索工具
linux系統默認使用的 UTF-8 編碼,對於linux的開發人員而言,就簡單多了,都用 UTF-8 就萬事大吉了,這裏使用 QtCreator + gcc 來作講解開發工具
若是咱們須要徹底使用 GBK 編碼來開發也是能夠的,須要在 Qt 工程的 main 函數加入下面的設置,並使用 GBK 格式的源文件編碼
QTextCodec *codec = QTextCodec::codecForName("gbk"); QTextCodec::setCodecForLocale(codec);
QString
是 UNICODE
編碼,確切來講是 UTF-16
編碼。Qt程序想正確顯示中文,那麼就須要把其餘編碼的字符串轉爲 UNICODE
編碼。而後咱們來講一下 QString 的幾種構造方式code
//這種是默認傳入的字符串爲 UTF-8 QString strTest = QString("我是"); //這個就是從 UTF-8 字符串構造,和上面同樣 QString strTest = QString::fromUtf8("我是"); //這個也是默認字符串爲UTF-8 QString strTest = QString::tr("我是"); //這個編碼根據系統來,windows就是GBK,linux就是UTF-8 QString strTest = QString::fromlocal8Bit("我是"); //這個就是 ASCII 這種了,單字節的 QString strTest = QString::fromLatin1();
注意接口
QTextCodec* gbkcodec = QTextCodec::codecForName("gbk"); //下面是GBK編碼的字符串 const char* bdata = "你好,世界" //使用TextCodec庫來轉換gbk到unicode QString strGBK = gbkcodec->toUnicode(bdata);
最後咱們推薦使用 UTF-8 編碼的方式,這樣能夠方便兼容 windows 和 linux 多平臺utf-8