Qt專欄:
目錄
1.引言
2.原因分析
3.源文件的編碼格式修改方法
4.程序內(nèi)部使用的默認(rèn)編碼格式修改方法
5.QString轉(zhuǎn)std::string的方法
6.總結(jié)
1.引言
? ? ? ? 在編寫(xiě)Qt程序的時(shí)候,或多或少都可能遇到用QString時(shí)候,明明自己寫(xiě)的是中文,但是在界面上顯示出來(lái)卻是亂碼,最終的原因都是加載字符串的方式和程序中內(nèi)部字符默認(rèn)的編碼方式不匹配造成的。下面就這個(gè)原因仔細(xì)分析分析。
2.原因分析
? ? ? ? 默認(rèn)情況下,QtCreator內(nèi)部的字符編碼方式是utf-8,vs(如VS2019)內(nèi)部的字符編碼方式是gbk。windows上一般是gbk,其他平臺(tái)一般utf-8。
? ? ? ? 源代碼的文件格式,在QtCreator添加的文件(.h、.cpp等)默認(rèn)都是utf-8編碼,在vs中添加的文件(.h、.cpp等)默認(rèn)都是GB2312編碼。文件格式可以通過(guò)EditPlus、Notepad++或其它工具查看,下面是Notepad++查看到的文件編碼方式:
? ? ? ?當(dāng)然也可以修改文件的編碼格式。
? ? ? ? Qt界面內(nèi)容顯示都是通過(guò)QString來(lái)傳值的,QString內(nèi)部使用的Unicode編碼,特別是有中文時(shí),一般使用QString::fromLocal8Bit來(lái)加載中文,如:
QString text = QString::fromLocal8Bit("設(shè)備屬性");
? ? ? ? 關(guān)于QString::fromLocal8Bit的講解,可以查看我的另外一篇博客:
QString的toStdString、toLocal8bit和toLatin區(qū)別_tolocal8bit tolatin1 tostdstring-CSDN博客
? ? ? ? 通過(guò)上述分析,出現(xiàn)亂碼來(lái)自三方面的原因:
? ? ? ? 1)? 源文件的編碼格式
? ? ? ? 2)? 程序(QtCreator、VS2019等)內(nèi)部使用的默認(rèn)編碼格式
? ? ? ? 3)? QString加載中文的方式
? ? ? ? 在Qt程序中用QString::fromLocal8Bit或QStringLiteral加載中文,在默認(rèn)的內(nèi)部字符編碼環(huán)境中都不會(huì)出現(xiàn)亂碼。
Qt6之QStringLitertal源碼分析_qstring源碼分析-CSDN博客
3.源文件的編碼格式修改方法
? ? ? ? 上面講了源文件的編碼格式可以通過(guò)EditPlus、Notepad++等工具修改,還可以通過(guò)VS來(lái)修改,步驟如下:
? ? ? ? 第一步:
? ? ? ? 第二步:
? ? ? ?OK。
4.程序內(nèi)部使用的默認(rèn)編碼格式修改方法
方法1:使用QTextCodec
#include "MainWindow.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//設(shè)置內(nèi)部編碼方式
QTextCodec* codec = QTextCodec::codecForName("GB2312");
QTextCodec::setCodecForLocale(codec);
MainWindow w;
w.show();
return a.exec();
}
方法2:在源碼開(kāi)頭添加 ??#pragma? execution_character_set("utf-8")
如下示例:
用預(yù)處理命令??#pragma execution_character_set("utf-8")將cpp編碼設(shè)置為utf-8。
方法3:如果在Visual Studio中,直接可以使用 /utf-8 選項(xiàng)將源字符集和執(zhí)行字符集指定為使用 UTF-8 編碼的字符集。 它等效于在命令行上指定 /source-charset:utf-8 /execution-charset:utf-8。
????????設(shè)置步驟如下:
????????1)打開(kāi)項(xiàng)目“屬性頁(yè)” 對(duì)話框。 有關(guān)詳細(xì)信息,請(qǐng)參閱在 Visual Studio 中設(shè)置 C++ 編譯器和生成屬性。
????????2)選擇“配置屬性”>“C/C++”>“命令行”屬性頁(yè)。
????????3)在“附加選項(xiàng)”中,添加 /utf-8 選項(xiàng)以指定首選編碼。
????????4)選擇“確定”以保存更改 。
????????如下圖所示:
5.QString轉(zhuǎn)std::string的方法
? ? ? ? 直接用QString的toStdString就有可能出現(xiàn)中文亂碼。
????????QString轉(zhuǎn)std::string亂碼通常是由于編碼不一致導(dǎo)致的。Qt默認(rèn)使用的編碼可能是UTF-8,而std::string可能默認(rèn)使用的是系統(tǒng)的本地編碼,如GBK。
? ? ? ? 一般使用QString::toLocal8Bit()先將QString轉(zhuǎn)為QByteArray,然后使用std::string的構(gòu)造函數(shù)轉(zhuǎn)為std::string。代碼如下:
QString qStr = QString::fromUtf8("你好,世界");
std::string str = qStr.toLocal8Bit().constData();
6.總結(jié)
? ? ? ? 你們?cè)谑褂肣t編程的過(guò)程中,出現(xiàn)過(guò)中文亂碼的情況嗎?歡迎留言討論。
參考:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-852406.html
/utf-8(將源字符集和執(zhí)行字符集設(shè)置為 UTF-8) | Microsoft Learn文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-852406.html
到了這里,關(guān)于Qt中出現(xiàn)中文亂碼的原因以及解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!