Visual Studio 2019 + Qt5 C++编程的中文处理

闻人锦
2023-12-01

单独在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

 类似资料: