QT 中文亂碼問題

2021-08-20 07:49:11 字數 1391 閱讀 5122

1,將設定改為「如果是utf-8編碼,則新增」。

2,.cpp檔案開始新增

#pragma execution_character_set("utf-8")
根據 qt 的文件:中規定 qstring 的 const char* 建構函式是呼叫 fromutf8() 構造的。所以要求字串字面量是 utf-8 編碼的位元組。

這裡先要解釋一下下面兩個概念:

原始碼字符集(the source character set):原始碼檔案是使用何種編碼儲存的

執行字符集(the execution character set):可執行程式內儲存的是何種編碼(程式執行時記憶體中字串編碼)

原始碼字符集很容易理解,就是我們源**的編碼。為了我們的**能夠跨平台,原始檔要儲存為帶 bom 的 utf-8。

執行字符集就麻煩多了。比如我們下面的**片段:

qstring str("我是中文");

即使這個檔案存為 utf-8 格式了,編譯成 exe 檔案時,編譯器也可能對這個字串常量進行轉碼,轉為別的編碼格式。

在 gcc 中,控制這個轉碼操作的命令列引數是:-fexec-charset=charset

如果不指定的話預設是 utf-8。所以我們用 gcc 時很少關注這個問題。

viual stdio 中就麻煩多了。這裡先說 visual stdio 2015,這個是我現在用的編譯環境。vs2015 中如果源**是 utf-8的,執行字符集預設是本地 locale 字符集,對於簡體中文的 windows 系統來說,這個 本地locale字符集是 gb18030。所以直接顯示漢字會全是亂碼。

解決這個亂碼有三個辦法,第乙個辦法是編譯時加入命令列引數,在 qt 的 pro 檔案中可以這樣:

msvc:qmake_cxxflags += -execution-charset:utf-8

第二個辦法是在原始檔中加入:

#pragma execution_character_set("utf-8")

更好的辦法是源**寫為:

qstring  str(u8"我是中文");

當然,這裡要求編譯器支援 c++11,因此上面的**在 vs2005、vs2008 上是無法編譯通過的。

另外,如果源**儲存為不帶 bom 的 utf-8。那需要告訴 vs2015 我們的編碼格式是 utf-8,可以在 pro 檔案中加入如下的**:

msvc:qmake_cxxflags += -source-charset:utf-8

另外再說說 vs2005、vs2008 下該如何設定。首先這兩個編譯器都不支援 c++11,也不支援執行字符集的設定,執行字符集就是預設的本地 locale 字符集。所以我們的**只能寫為:

qstring str = qstring::fromlocal8bit("我是中文");

qt 中文亂碼 Qt中文亂碼問題

接觸了qt,由於習慣中vs,如果使用vs寫qt 剛接觸很快就發現有中文亂碼問題,我的解決方法如下 新建乙個標頭檔案,比如qtchcharset.h,標頭檔案中內容如下 pragma once ifdef q os win q os win 新增後支援gb2312,utf 8 bom,unicode ...

亂碼問題 Qt中文亂碼問題

接觸了qt,由於習慣中vs,如果使用vs寫qt 剛接觸很快就發現有中文亂碼問題,我的解決方法如下 新建乙個標頭檔案,比如qtchcharset.h,標頭檔案中內容如下 pragma once ifdef q os win q os win 新增後支援gb2312,utf 8 bom,unicode ...

qt 中文亂碼問題

qtextcodec codec qtextcodec codecforname utf 8 qtextcodec setcodecfortr codec qtextcodec setcodecforlocale qtextcodec codecforlocale qtextcodec setcod...