天天看點

徹底解決Qt中文亂碼以及漢字編碼的問題(UTF-8/GBK)(二)

六、測試案例

#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".

徹底解決Qt中文亂碼以及漢字編碼的問題(UTF-8/GBK)(二)

解決方法由兩種:

方法1:

徹底解決Qt中文亂碼以及漢字編碼的問題(UTF-8/GBK)(二)

把qcom\的所有cpp和h檔案都用工具轉換成ANSI編碼,main()函數使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

方法2:

先把Qt Creator環境設定用的是UTF-8編碼,

徹底解決Qt中文亂碼以及漢字編碼的問題(UTF-8/GBK)(二)

再把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的編碼方式.

徹底解決Qt中文亂碼以及漢字編碼的問題(UTF-8/GBK)(二)

另外,還需要在預編譯頭檔案加入

#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.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

尊重作者,支援原創,如需轉載,請附上原位址:

https://blog.csdn.net/libaineu2004/article/details/19245205