Qt跨平臺編程之中文編碼問題

前言

在使用 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 自從 windows 2000 後 就開始使用 UNICODE 字符集,具體編碼是 UTF-16 編碼。而後從 vista 以後開始支持 UNICODE 5.0 標準,對 UTF-16 的支持也更加完善,支持 UTF-16 surrogate 擴展字符的顯示。對於windows的開發人員而言,咱們須要知道 windows 上具體表明 UTF-16 編碼的數據類型,這裏以 visual studio 系列 IDE 和所帶的編譯器爲例,Qt這裏也使用了 msvc 編譯器環境函數

  1. 表明 UTF-16 的數據類型是 wchar_t,也就是咱們工程設置選擇的寬字符。可能有人會問,UTF-16 是變長編碼,擴展編碼會用到4個字節,wchar_t 怎麼表示?遺憾的是的確無法表示,這更像是 UCS-2 標準,可是咱們須要知道的是 windows 的內核的確是 UTF-16 的,只是編程接口只提供了兩字節的 wchar_t。不過這些擴展字符基本用不到,因此咱們不用過多考慮,若是你須要瞭解更多能夠自行查閱資料,博主暫時未深刻
  2. visual studio 建立的源碼文件默認是 ANSI 編碼,此時 char 字符串是默認的 GBK 編碼,微軟的開發工具和編譯器對 GBK 支持良好
  3. 咱們固然也能夠設置 visual studio 採用 UTF-8 編碼,只須要使用 UTF-8 格式的源碼文件,而後在源碼中加入下面的預編譯宏。這樣 char 字符串就默認爲 UTF-8 編碼了,Qt + msvc 的設置也是如此
#if defined(_MSC_VER) && (_MSC_VER >= 1600)  
# pragma execution_character_set("utf-8")  
#endif

注意:文件格式使用 UTF-8 可能出現 "error C2001: 常量中有換行符" 的狀況,這時候能夠改文件格式爲 UTF-8 BOM 來解決問題。實際上還有一些其餘的解決方案,你們能夠自行搜索工具

linux 字符編碼

linux系統默認使用的 UTF-8 編碼,對於linux的開發人員而言,就簡單多了,都用 UTF-8 就萬事大吉了,這裏使用 QtCreator + gcc 來作講解開發工具

若是咱們須要徹底使用 GBK 編碼來開發也是能夠的,須要在 Qt 工程的 main 函數加入下面的設置,並使用 GBK 格式的源文件編碼

QTextCodec *codec = QTextCodec::codecForName("gbk");
QTextCodec::setCodecForLocale(codec);

Qt5 字符編碼

QStringUNICODE 編碼,確切來講是 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();

注意接口

  1. QString 是 UTF-16 ,那麼 QChar 就和 WCHAR 同樣是兩個字節
  2. fromLocal8Bit 是和系統相關的函數,這個函數在windows上,是從GBK 轉爲 unicode,可是若是是 linux,那麼就是從 UTF-8 轉爲 unicode。因此若是咱們須要固定的 GBK 轉 UNICODE,那麼請採用下面的方式
QTextCodec* gbkcodec = QTextCodec::codecForName("gbk");
//下面是GBK編碼的字符串
const char* bdata = "你好,世界"     
//使用TextCodec庫來轉換gbk到unicode
QString strGBK = gbkcodec->toUnicode(bdata);

最後咱們推薦使用 UTF-8 編碼的方式,這樣能夠方便兼容 windows 和 linux 多平臺utf-8

參考:https://wiki.qt.io/Strings_and_encodings_in_Qt

相關文章
相關標籤/搜索