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

简介: 彻底解决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".

image.png


解决方法由两种:


方法1:

image.png



把qcom\的所有cpp和h文件都用工具转换成ANSI编码,main()函数使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));


方法2:


先把Qt Creator环境设置用的是UTF-8编码,


image.png


再把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的编码方式.

image.png



另外,还需要在预编译头文件加入


#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文件加入


#if defined(_MSC_VER) && (_MSC_VER >= 1600)    

# pragma execution_character_set("utf-8")    

#endif


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");

#endif

   QTextCodec::setCodecForLocale(codec);

   QTextCodec::setCodecForCStrings(codec);

   QTextCodec::setCodecForTr(codec);

#else

   QTextCodec *codec = QTextCodec::codecForName("utf-8");

   QTextCodec::setCodecForLocale(codec);

#endif


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


相关文章
|
Ubuntu Windows
Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4
Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4
Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4
|
编解码 Ubuntu 编译器
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
|
6月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
168 4
|
9月前
|
SQL 存储 算法
Qt编码之谜:乱码问题的成因与解决策略
Qt编码之谜:乱码问题的成因与解决策略
291 0
|
9月前
|
编解码 IDE 开发工具
QT案例IDE编写 -- 通过枚举实现编码切换
QT案例IDE编写 -- 通过枚举实现编码切换
70 0
|
9月前
|
编解码 JavaScript 编译器
[字符编码] 实战篇:QT中文乱码的解决办法
[字符编码] 实战篇:QT中文乱码的解决办法
2306 0