日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

發(fā)布時(shí)間:2023/12/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

尊重作者,支持原創(chuàng),如需轉(zhuǎn)載,請(qǐng)附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205

一、Qt Creator環(huán)境設(shè)置

1、cpp或h文件從window上傳到Ubuntu后會(huì)顯示亂碼,原因是因?yàn)閡buntu環(huán)境設(shè)置默認(rèn)是utf-8,Windows默認(rèn)都是GBK.

我們使用的Windows系統(tǒng)本地字符集編碼為GBK。

2、Windows環(huán)境下,Qt Creator,菜單->工具->選項(xiàng)->文本編輯器->行為->文件編碼->默認(rèn)編碼,常用的選項(xiàng)有以下幾個(gè):

System(簡體中文windows系統(tǒng)默認(rèn)指的是GBK編碼)

GBK/windows-936-2000/CP936/MS936/windows-936

UTF-8

二、編碼知識(shí)科普
Qt常見的兩種編碼是:UTF-8和GBK
★UTF-8:Unicode TransformationFormat-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節(jié)編碼,它對(duì)英文使用8位(即一個(gè)字節(jié)),中文使用24為(三個(gè)字節(jié))來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強(qiáng)。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯示。如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。
★GBK是國家標(biāo)準(zhǔn)GB2312基礎(chǔ)上擴(kuò)容后兼容GB2312的標(biāo)準(zhǔn)。GBK的文字編碼是用雙字節(jié)來表示的,即不論中、英文字符均使用雙字節(jié)來表示,為了區(qū)分中文,將其最高位都設(shè)定成1。GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數(shù)據(jù)庫比GBD大。GBK是GB2312的擴(kuò)展,除了兼容GB2312外,它還能顯示繁體中文,還有日文的假名。
★GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉(zhuǎn)換:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
★在簡體中文windows系統(tǒng)下,ANSI編碼代表GBK/GB2312編碼,ANSI通常使用0x80~0xFF范圍的2個(gè)字節(jié)來表示1個(gè)中文字符。0x00~0x7F之間的字符,依舊是1個(gè)字節(jié)代表1個(gè)字符。Unicode(UTF-16)編碼則所有字符都用2個(gè)字節(jié)表示。

三、編碼轉(zhuǎn)換

Windows自帶的記事本,無法查看UTF-8編碼的文件到底有無BOM,需要使用其他文件編輯器,比如EditPlus或者SublimeText。
UTF-8與ANSI(即GBK)的互轉(zhuǎn),可以使用EditPlus工具"文件另存為"或者Encodersoft編碼轉(zhuǎn)換工具對(duì).cpp和.h源文件文本進(jìn)行批量轉(zhuǎn)換.

四、QString顯示中文亂碼的原因

我們使用的Windows系統(tǒng)本地字符編碼(Local字符集)為GBK。編譯器分析出源文件字符編碼之后,會(huì)進(jìn)行解碼再編碼,將源字符集轉(zhuǎn)碼成執(zhí)行字符集。執(zhí)行字符集一般默認(rèn)為使用本地字符編碼(Local字符集)。

Qt5可以設(shè)置Local字符集,GBK/UTF-8

QTextCodec *codec = QTextCodec::codecForName("UTF-8");//或者"GBK",不分大小寫 QTextCodec::setCodecForLocale(codec);

Qt5中QString內(nèi)部采用unicode字符集,utf-16編碼。構(gòu)造函數(shù)QString::QString(const char *str)默認(rèn)使用fromUtf8(),將str所指的執(zhí)行字符集從utf-8轉(zhuǎn)碼成utf-16。
由上面fromUtf8()可知,QString需要執(zhí)行字符集編碼為utf-8,然后以u(píng)tf-8進(jìn)行解碼,再編碼為utf-16才能獲得正確的字符編碼。顯示中文亂碼的原因其實(shí)就是QString轉(zhuǎn)碼方式與執(zhí)行字符集不一致。(比如,源字符集為本地字符集GBK編碼,QString以u(píng)tf-8的方式進(jìn)行解碼,會(huì)導(dǎo)致獲得錯(cuò)誤的二進(jìn)制編碼,再將錯(cuò)誤二進(jìn)制轉(zhuǎn)為utf-16就會(huì)出現(xiàn)亂碼。)
?

五、Qt編碼指定
Qt需要在main()函數(shù)指定使用的字符編碼:

#include <QTextCodec>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

//設(shè)置中文編碼

a.setFont(QFont("Microsoft Yahei", 9)); #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VER QTextCodec *codec = QTextCodec::codecForName("GBK"); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); #endif QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); #endif }

這里只列舉大家最常用的3個(gè)編譯器(微軟VC++的cl編譯器,Mingw中的g++,Linux下的g++),源代碼分別采用GBK和無BOM的UTF-8以及有BOM的UTF-8這3種編碼進(jìn)行保存,發(fā)生的現(xiàn)象如下表所示。

如果您使用的是Visual C++編譯器,則默認(rèn)情況下不會(huì)將您的源代碼視為utf-8編碼。除非有BOM,否則它將使用您當(dāng)前的代碼頁進(jìn)行解釋。就是說,當(dāng)使用Visual C++編譯程序的時(shí)候,它會(huì)分析源文件采用何種編碼,有BOM標(biāo)識(shí)符則可以正確識(shí)別其編碼是UTF-8,若沒有BOM標(biāo)識(shí)符則認(rèn)為其使用本地字符集編碼(Local字符集)。Local字符集是什么?取決于你的設(shè)置QTextCodec *codec = QTextCodec::codecForName(???);
如果源文件是UTF-8+BOM的編碼方式,還需要在頭文件加入

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

或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中。

如果源文件是UTF-8+無BOM的編碼方式,則一定不能加#pragma execution_character_set(“utf-8”),不然會(huì)產(chǎn)生亂碼。
?

六、測試案例

案例1、中文字符串測試

#include <QApplication> #include <QTextCodec> #include <QPushButton> #include <QDebug> #include <QString>int main(int argc, char *argv[]) { QApplication a(argc, argv); #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VER QTextCodec *codec = QTextCodec::codecForName("gbk"); #else QTextCodec *codec = QTextCodec::codecForName("utf-8"); #endif QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #else QTextCodec *codec = QTextCodec::codecForName("utf-8"); QTextCodec::setCodecForLocale(codec); #endifQString str(QObject::tr("1中文")); qDebug() << str; qDebug() << QStringLiteral("2中文"); qDebug() << QString::fromLatin1("3中文"); qDebug() << QString::fromLocal8Bit("4中文"); qDebug() << QString::fromUtf8("5中文"); qDebug() << QString::fromWCharArray(L"6中文");return a.exec(); } 當(dāng)QTextCodec::codecForName("utf-8");時(shí),QString::fromLocal8Bit和QString::fromUtf8是等效的。當(dāng)QTextCodec::codecForName("gbk");時(shí),QString::fromLocal8Bit和QString::fromUtf8是不等效的。

案例2、QCom跨平臺(tái)串口調(diào)試助手(http://www.qter.org/?page_id=203)
源代碼qcom\mainwindow.cpp,aboutdialog.cpp等文件用的是UTF-8編碼(無BOM);但是qcom\qextserial\*.*文件用的是ANSI編碼.在linux環(huán)境編譯完全OK.
筆者Windows環(huán)境的Qt Creator+微軟VC++編譯器,環(huán)境設(shè)置用的是ANSI(即GBK)編碼.編譯源文件會(huì)報(bào)錯(cuò).
錯(cuò)誤提示"fatal error C1018: 意外的 #elif".

解決方法由兩種:

方法1:

把qcom\的所有cpp和h文件都用工具轉(zhuǎn)換成ANSI編碼,main()函數(shù)使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

方法2:

先把Qt Creator環(huán)境設(shè)置用的是UTF-8編碼,

再把qcom\的所有cpp和h文件都用工具轉(zhuǎn)換成UTF-8+BOM編碼,請(qǐng)注意,如果文件轉(zhuǎn)換成UTF-8(無BOM),編譯仍會(huì)失敗.main()函數(shù)使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));//注意,此處仍是"GBK",不是"UTF-8"
重新編譯,OK!

其它:

七、結(jié)論

Windows環(huán)境下,Qt Creator+微軟VC++編譯器,新建工程,

1、如果該工程不需要跨平臺(tái)使用(只在win),那么工程設(shè)置請(qǐng)使用GBK的編碼方式.

2、如果該工程要跨平臺(tái)使用(win+linux),那么工程設(shè)置請(qǐng)使用UTF-8+BOM的編碼方式.

另外,還需要在頭文件加入

#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中。

3、Linux環(huán)境下,Qt Creator+gcc,新建工程,

沒有GBK編碼可選,默認(rèn)是UTF-8(無BOM)編碼方式,考慮到跨平臺(tái),建議選擇UTF-8+BOM的編碼方式.

x、參考文獻(xiàn)

Qt官網(wǎng)文檔?

https://wiki.qt.io/Strings_and_encodings_in_Qt

https://doc.qt.io/qt-5/unicode.html

ASCII,Unicode和UTF-8完全搞清楚?https://blog.csdn.net/Deft_MKJing/article/details/79460485

Qt中文亂碼原因及解決方案?https://blog.csdn.net/qq_35905572/article/details/95042444

Qt中文亂碼問題?http://blog.csdn.net/brave_heart_lxl/article/details/7186631

尊重作者,支持原創(chuàng),如需轉(zhuǎn)載,請(qǐng)附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205
————————————————
版權(quán)聲明:本文為CSDN博主「libaineu2004」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/libaineu2004/article/details/19245205

總結(jié)

以上是生活随笔為你收集整理的彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。