在使用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 2000 後 就開始使用 unicode 字符集,具體編碼是 utf-16 編碼。然後從 vista 之後開始支援 unicode 5.0 標準,對 utf-16 的支援也更加完善,支援 utf-16 surrogate 擴充套件字元的顯示。對於windows的開發人員而言,我們需要知道 windows 上具體代表 utf-16 編碼的資料型別,這裡以 visual studio 系列 ide 和所帶的編譯器為例,qt這裡也使用了 msvc 編譯器環境
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系統預設使用的 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 的幾種構造方式
//這種是預設傳入的字串為 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 = "你好,世界"
//使用textcodec庫來轉換gbk到unicode
qstring strgbk = gbkcodec->tounicode(bdata);
最後我們推薦使用 utf-8 編碼的方式,這樣可以方便相容 windows 和 linux 多平台
參考:
Qt5 6跨平台問題
啊,這個問題。最近寫了乙個鬥魚彈幕接收的cpp。其實是官方文件給的大部分,我修改了一小點qaq。想著qt垮了個平台,然後就出了這檔子事。我是在ubuntu 64位下qt5.664 位編譯的成功的能執行。然後放到了win7 64位下的qt5.632位 就出錯。問題如下 d qt qt5.6.1 5.6...
程式設計之美之中國象棋問題
一 題目原型 下過中國象棋的朋友都知道,雙方的 將 和 帥 相隔遙遠,並且它們不能照面。在象棋殘局中,許多高手能利用這一規則走出精妙的殺招。假設棋盤上只有 將 和 帥 二子 如圖 1 3所示 為了下面敘述方便,我們約定用a表示 將 b表示 帥 那麼a和b的運動將被限制在己方的3x3的格仔中,a b可...
詳談c 跨平台編碼的問題
最近要將乙個windows下的專案放到樹莓派上,以便充分利用頻寬資源,使其以夜繼程式設計客棧日的程式設計客棧工作 在此記錄一下編碼問題和方案 在windo程式設計客棧ws下,現在用的vs2coxesaqypg015,建立的 檔案預設編碼是ansi,windows特有的概念,本地編碼,結合實際情況就是...