六、測試案例
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
#include <QApplication>
#include <QTextCodec>
#include <QPushButton>
#include <QDebug>
#include <QString>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//設定中文字型
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
QString 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();
}
當QTextCodec::codecForName("utf-8");時,
QString::fromLocal8Bit和QString::fromUtf8是等效的。
當QTextCodec::codecForName("gbk");時,
QString::fromLocal8Bit和QString::fromUtf8是不等效的。
案例2、QCom跨平台序列槽調試助手(http://www.qter.org/?page_id=203)
源代碼qcom\mainwindow.cpp,aboutdialog.cpp等檔案用的是UTF-8編碼(無BOM);但是qcom\qextserial\*.*檔案用的是ANSI編碼.在linux環境編譯完全OK.
筆者Windows環境的Qt Creator+微軟VC++編譯器,環境設定用的是ANSI(即GBK)編碼.編譯源檔案會報錯.
錯誤提示"fatal error C1018: 意外的 #elif".

解決方法由兩種:
方法1:
把qcom\的所有cpp和h檔案都用工具轉換成ANSI編碼,main()函數使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
方法2:
先把Qt Creator環境設定用的是UTF-8編碼,
再把qcom\的所有cpp和h檔案都用工具轉換成UTF-8+BOM編碼,請注意,如果檔案轉換成UTF-8(無BOM),編譯仍會失敗.main()函數使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));//注意,此處仍是"GBK",不是"UTF-8"
重新編譯,OK!
其它:
七、結論
Windows環境下,Qt Creator+微軟VC++編譯器,建立工程,
1、如果該工程不需要跨平台使用(隻在win),那麼工程設定請使用GBK的編碼方式.
2、如果該工程要跨平台使用(win+linux),那麼工程設定請使用UTF-8+BOM的編碼方式.
另外,還需要在預編譯頭檔案加入
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro檔案中。
3、Linux環境下,Qt Creator+gcc,建立工程,
沒有GBK編碼可選,預設是UTF-8(無BOM)編碼方式,考慮到跨平台,建議選擇UTF-8+BOM的編碼方式.
★★★★★★★★★★★★★★★綜上所述,解決亂碼的方法概括如下:★★★★★★★★★★★★★★★★★★★★★
1、如果IDE是Qt Creator,把它的環境設定為“UTF-8+BOM”編碼。
2、如果IDE是Visual Studio,請下載下傳插件,名稱是ForceUTF8 (with BOM),所有源檔案和頭檔案都會儲存為“UTF-8+BOM”編碼。
3、如果編譯器是MSVC,請在預編譯頭stdafx.h檔案加入
4、源碼檔案main函數入口設定中文編碼:
#include <QTextCodec>
QApplication a(argc, argv);
//設定中文字型
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");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
5、如此一來,不管是MSVC編譯器還是MinGW編譯器,都能編譯通過,且支援中文!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
x、參考文獻
Qt官網文檔
https://wiki.qt.io/Strings_and_encodings_in_Qt https://doc.qt.io/qt-5/unicode.htmlASCII,Unicode和UTF-8完全搞清楚
https://blog.csdn.net/Deft_MKJing/article/details/79460485Qt中文亂碼原因及解決方案
https://blog.csdn.net/qq_35905572/article/details/95042444Qt中文亂碼問題
http://blog.csdn.net/brave_heart_lxl/article/details/7186631尊重作者,支援原創,如需轉載,請附上原位址:
https://blog.csdn.net/libaineu2004/article/details/19245205