前言
在使用 Qt5 進行開發的程序中遇到了一些跨平臺的中文編碼轉換問題,然后進行了一番調查,這里做個總結,希望能幫上他人
字符編碼
首先我們認識一下 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,不過這些擴展字符基本用不到,所以我們不用過多考慮,如果你需要了解更多可以自行查閱資料,博主暫時未深入 - visual studio 創建的原始碼檔案默認是 ANSI 編碼,此時 char 字串是默認的 GBK 編碼,微軟的開發工具和編譯器對 GBK 支持良好
- 我們當然也可以設定 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 字符編碼
QString 是 UNICODE 編碼,確切來說是 UTF-16 編碼,Qt程式想正確顯示中文,那么就需要把其他編碼的字串轉為 UNICODE 編碼,然后我們來說一下 QString 的幾種構造方式
//這種是默認傳入的字串為 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();
注意
- QString 是 UTF-16 ,那么 QChar 就和 WCHAR 一樣是兩個位元組
- fromLocal8Bit 是和系統相關的函式,這個函式在windows上,是從GBK 轉為 unicode,但是如果是 linux,那么就是從 UTF-8 轉為 unicode,所以如果我們需要固定的 GBK 轉 UNICODE,那么請采用下面的方式
QTextCodec* gbkcodec = QTextCodec::codecForName("gbk");
//下面是GBK編碼的字串
const char* bdata = "https://www.cnblogs.com/magicdmer/p/你好,世界"
//使用TextCodec庫來轉換gbk到unicode
QString strGBK = gbkcodec->toUnicode(bdata);
最后我們推薦使用 UTF-8 編碼的方式,這樣可以方便兼容 windows 和 linux 多平臺
參考:https://wiki.qt.io/Strings_and_encodings_in_Qt
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251338.html
標籤:C++
下一篇:STL簡介
