1. 程式人生 > >Qt中關於中文字元編碼問題

Qt中關於中文字元編碼問題


今天在QtCreator中code的時候,遇到了一個奇怪的問題。我寫了以下一段程式碼:

QString filePath;
 filePath = QFileDialog::getOpenFileName(NULL,QString("開啟戶型圖"),QString(),QString("戶型圖檔案(*.bmp *.jpg *.png)"));


編譯器報如下錯誤:

E:\Qt Projects\Huxing\src\mainwindow.cpp:87: error: C2146: 語法錯誤: 缺少“)”(在識別符號“鎴峰瀷鍥炬枃浠”的前面)

不用說,一定是中文編碼的問題。於是在網上查閱了一番資料,得出了以下一些心得。

中文字元一般採用兩套編碼,GBK和UTF-8。Windows平臺下一般是GBK編碼,其他平臺一般是UTF-8。我的這個原始檔是用QtCreator生成的,在工具-》選項-》文字編輯器-》行為中我設定了預設編碼為UTF-8,而我的編譯器是MSVC,編碼為GBK,所以就產生了錯誤。

解決方法很簡單:

第一種,更改QtCreator的編碼為GBK,然後新建原始檔,把舊檔案裡的程式碼全部拷貝過去。缺點麼,採用GBK而不是UTF-8就是最大的缺點了。
第二種,與上面一樣,但改編碼為UTF-8+BOM。需要在原始檔頭部新增如下程式碼來告訴MSVC使用UTF-8的執行字符集:

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif

第三種,改為使用MinGW的編譯器。

這種編碼問題只是原始檔中的。另一個編碼問題是生成的目標程式中的。要讓沒有裝GBK編碼的系統也能識別程式中的中文,就需要將程式中的中文編碼為UTF-8。QString類內建的編碼就是Unicode,因此,只要將所有中文轉換為QString就可以了。需要注意的是在轉換時要讓Qt知道被轉換的串的編碼。例如,如果原始檔編碼為GBK,在Qt4中,可以這樣寫:

    QTextCodec::setCodecForCString(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));


但是,在Qt5中,這兩個函式被去除了,因此無法再用這種方法指定編碼。不過,Qt5預設採用UTF-8的執行字符集,因此如果使用MinGW的編譯器,就沒有問題了。但如果是MSVC的編譯器,還是需要採用上面所說的方法。