单独在Visual Studio 或者QtCreator中用C++编程,那么用缺省的编码来处理中文,应该是没什么问题的,但如果要在这两者之间不停切换编程,中文的乱码就是我们经常会遇到的问题了。
网上给出多种乱七八糟的方式,都只能解决某部分的问题,我参考了这些文章,给出一个完整的解决方案。
彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)_libaineu2004的博客-CSDN博客_qt中文乱
码
【图片】VS2019+QT控制台中文乱码【qt吧】_百度贴吧
Qt5中文乱码及qDebug()无乱码输出中文_airts001的博客-CSDN博客_qt中qdebug能输出汉字吗
1. 在主程序中加入 textCodec 设置:
QTextCodec *textCodec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(textCodec);
注:如果不在 qDebug 中输出中文,则可以不加上面的设置
2. 中文字符串前加上u8,比如:
u8"中文调试"
3. VS属性->C/C++->所有选项->附加选项->加上/UTF-8;
4. QtCreator的.pro文件中增加:
QMAKE_CXXFLAGS += /source-charset:utf-8
QMAKE_CXXFLAGS += /execution-charset:utf-8
5. 所有文件以 UTF-8(BOM) 的格式进行保存;
6. 如果命令行窗口显示的中文为乱码,则需要改变其代码设置为:65001(UTF-8)
使用regedit修改在 计算机\\HKEY_CURRENT_USER\\Console 中的cmd相关值
(1)Visual Studio 的命令行窗口参数:
C:_Program Files(x86)_Microsoft Visual Studio_2019_Community_Common7_IDE_CommonExtensions_Platform_Debugger_VsDebugConsole.exe
CodePage REG_DWORD 0x0000fde9(65001)
(2)QtCreator 的命令行窗口参数:
D:_Qt_Tools_QtCreator_bin_qtcreator_process_stub.exe
CodePage REG_DWORD 0x0000fde9(65001)
(3)cmd的参数:
%SystemRoot%_system32_cmd.exe
CodePage REG_DWORD 0x0000fde9(65001)
如果没有则新建这些项,并根据自己的安装目录进行相应的修改。
测试代码:
#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 为了qDebug 输出中文,如果qDebug不用输出中文,则可以不加
QTextCodec *textCodec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(textCodec);
QString strChinese = u8"微软的Visual Studio 只能识别出UTF-8(BOM)格式文件,不能识别UTF-8文件,这个格式在QT中能够被正常处理\n"
u8"注意:\n"
u8" 1. 中文字符串前加上u8"
u8" 2.显示时用 toUtf8() 进行转换\n\n"
u8"注意,命令行窗体的代码页也要设置为:65001\n"
u8"使用regedit修改:"
u8"在 计算机\\HKEY_CURRENT_USER\\Console 下\n"
u8"Visual Studio 的命令行窗口参数:\n"
u8"C:_Program Files(x86)_Microsoft Visual Studio_2019_Community_Common7_IDE_CommonExtensions_Platform_Debugger_VsDebugConsole.exe\n"
u8"CodePage REG_DWORD 0x0000fde9(65001)\n\n"
u8"QtCreator 的命令行窗口参数:\n"
u8"D:_Qt_Tools_QtCreator_bin_qtcreator_process_stub.exe\n"
u8"CodePage REG_DWORD 0x0000fde9(65001)\n\n"
u8"如果没有则新建这些项,并根据自己的安装目录进行相应的修改。";
printf(u8"在Visual Studio和QtCreator两者中同时使用中文的注意事项:\n\n");
printf("%s\n\n", strChinese.toUtf8().data());
QString str = u8"中文调试";
//qDebug() << textCodec->toUnicode(str.toStdString().data());
qDebug() << u8"保证在VS和QT中都能正常显示中文的总结:";
qDebug() << u8"1. 在主程序中加入 textCodec 设置,中文字符串前加上u8";
qDebug() << u8"2. VS属性->C/C++->所有选项->附加选项->加上/UTF-8";
qDebug() << u8"3. QtCreator的.pro文件中增加:QMAKE_CXXFLAGS += /source-charset:utf-8";
qDebug() << u8" QMAKE_CXXFLAGS += /execution-charset:utf-8";
qDebug() << u8"所有文件以 UTF-8(BOM) 的格式进行保存";
qDebug() << u8"如果在命令窗口显示中文乱码,则参考上面的设置。";
return a.exec();
}
.pro 文件:
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
# VS中在属性->C++->All options->Additional Options 增加:/utf-8
# 源代码那里设置UTF-8
# 设置源代码文件字符集
QMAKE_CXXFLAGS += /source-charset:utf-8
# 设置exe文件字符集
QMAKE_CXXFLAGS += /execution-charset:utf-8
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target