您當前的位置:首頁 > 遊戲

Qt 5中文亂碼問題解決

作者:由 Listening 發表于 遊戲時間:2021-12-03

亂碼問題概述

使用Qt的時候,時常會遇到中文亂碼問題,qDebug

列印日誌亂碼

,或者Widget介面亂碼等等。

原因呢,大多是因為使用MSVC

編譯器

問題導致,而Qt 自帶的MinGW一般不會出現亂碼問題。

核心原因呢,是因為編碼問題,即UTF-8和GBK編碼千古疑難問題

使用MSVC編譯器輸出中文的問題

在 Qt Creator 中使用 MSVC 編譯器編譯專案時,若處理不當容易出現中文字串亂碼問題。 例如,程式執行時,LabInfo顯示的漢字就會出現亂碼。

void

MainWindow

::

Changed

()

{

QString

str

=

“測試”

ui

->

LabInfo

->

setText

str

);

}

12345

這是因為Qt Creator儲存的檔案使用的是

UTF-8編碼

(是任何平臺、任何語言都可以使用的跨平臺的

字符集

),MSVC編譯器雖然可以正常編譯帶BOM的UTF-8編碼的原始檔,但是生成的可執行檔案的編碼是 Windows 本地字符集,比如 GBK2312。

也就是在可執行檔案中,字串

“測試”

是以

GBK2312編碼

的,而可執行程式執行到這條語句時,對這個

字串

卻是以

UTF-8解碼

的,這樣就會出現亂碼。

解決方案

純Qt環境

解決這個問題有兩種方法

一種方法是使用

QStringLiteral()

宏或者

QString::fromLocal8Bit()

封裝字串,另一種方法是強制 MSVC 編譯器生成的可執行檔案使用UTF-8編碼。

1。 方案一

QStringLiteral(str)宏在編譯時將一個字串 str 生成字串資料,並且儲存在編譯後文件的只讀資料段中,程式執行時使用到此字串時,只需讀出此字串資料即可。

所以,程式碼可改為:

QString

str

=

QStringLiteral

“測試”

);

1

程式中需要

使用QStringLiteral()宏對每個中文字串

進行封裝,並且不能再使用tr()函式用於翻譯了。

缺陷:

需要對每個含有中文的字串進行封裝,而且tr()函式無法使用(無國際化翻譯需求可忽略)

方案二

強制 MSVC 編譯器採用 UTF-8 編碼生成可執行檔案,需要在每個使用到中文字串的標頭檔案和源程式檔案的前部加入如下的語句:

#if _MSC_VER >= 1600

//VS2015>VS>VS2010, MSVC VER= 10。0 -14。0

#pragma execution_character_set(“utf-8”)

#endif

123

VS 2010-VS 2015 Update2

的編譯器可以使用此方案,這是強制編譯後的執行檔案採用UTF-8編碼。這樣,即使不再使用QStringLiteral()宏,程式執行時也不會再出現漢字亂碼的問題了。而且,也可以採用tr()函式用於翻譯字串。

VS2015以後的使用如下方案:

在pro檔案中新增

win32

msvc

{

QMAKE_CXXFLAGS

+=

/

source

-

charset

utf

-

8

/

execution

-

charset

utf

-

8

}

123

VS +Qt環境編碼問題解決

一般而言,不會亂碼,因為文字,編譯器都是GBK編碼。但是為了更好的跨平臺相容性,改為UTF-8編碼的話,就需要做一些改動了。

首先需要將文字設定為UTF-8格式 這裡就不再介紹了,具體方案可參考VS2019 編碼問題,如何完美改為UTF-8

在專案屬性-C/C+±命令列-其他選項下面加入

/utf-8

測試發現,使用VS2019,用純Qt方案二的_MSC_VER宏也可以解決亂碼問題。

參考連結

/utf-8

execution_character_set

標簽: 亂碼  UTF  編碼  字串  編譯器