本文的主要解决方法来自于博客(Qt与MSVC中文乱码问题的解决方案_liuweilhy的博客-CSDN博客),特此鸣谢。

1.背景

今天心血来潮,将Qt编译器改为msvc 2019 64,应用程序中qdebug输出和界面输出的中文均出现乱码,而以前在用mingw编译器的时候,没有出现这种情况。

2、解决方法

出现问题,作为一个小白,自然是网上搜索,阅读了很多帖子,发现解决方案主要有以下几种:

  • (1)设置编码文件的编码为utf-8,且加入bom

  • (2)添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中
  • (3)在main函数中加入
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);

以上方法均尝试,在满足(1)的条件下,均无效。程序依然如故。

最后找到一个博客(Qt与MSVC中文乱码问题的解决方案_liuweilhy的博客-CSDN博客),最终解决了问题,为了便于以后查阅,特摘录部分

1. Qt Creator的编辑器默认使用UTF-8(代码页65001)编码来读取文本文件。而Visual Studio保存文件时默认采用的是本地编码,对于简体中文的Windows操作系统,这个编码就是GB2312(代码页936)。如果使用Qt Creator读取由Visual Studio创建的文件,那么编辑器就会以UTF-8编码格式读取GB2312编码格式的文件,出现中文乱码,因为这两套编码系统对汉字编码是不同的。至于英文部分不会乱码,是因为UTF-8和GB2312在单字节字符部分是兼容的。

2. MSVC在编译时,会根据源代码文件有无BOM来定义源码字符集。如果有BOM,则按BOM解释识别编码;如果没有,则使用本地字符集,对于简体中文的Windows操作系统就是GB2312。那么,当MSVC遇到一个没有BOM的UTF-8编码的文件时,它通常会把文件看作GB2312的来处理。如果文件全是英文没有问题,但如果包含中文,编译器就会出现误读。这种情况下,Qt Creator编辑器是正常的。但对于MSVC编译器,原代码会被它认识成下图这个样子:

不过,当以无BOM的UTF-8编码的字符串正好凑够偶数个字节时(比如偶数个汉字,或奇数个汉字加奇数个英文字母),编译器通常不会报警,因为它以为用GB2312编码读出的是正确的。

3. 不管源文件是何种编码,只要MSVC能够正确识别,就可以通过编译。但MSVC的执行字符集默认是本地字符集。对我们来说,它生成的可执行文件中的文字是GB2312编码的。而生成的Qt程序以UTF-8编码来识别GB2312编码的文字,对于“你好中文!”这几个字符,采用GB2312编码后再以UFT-8编码来读取,就会变成如下的乱码:

当以无BOM的UTF-8编码的字符串正好凑够偶数个字节时(比如偶数个汉字,或奇数个汉字加奇数个英文字母),反而不会出现乱码。那是因为,编译器用GB2312编码读出的乱码本身就是UTF-8编码的,现在又用UTF-8解读,自然就正确了。这纯粹是歪打正着。

首先,你要确定采用哪种源码字符集。你有两个选择:

1. 采用本地编码字符集(不推荐,跨平台时会比较麻烦,但在Visual Studio环境下配合Add-in工具编程比较方便);

2. 采用UTF-8编码字符集(推荐,适合跨平台)。

第二种方案的解决方法:

首先,要把项目中所有的头文件和源文件全都转换成UTF-8+BOM编码保存。

1. 第1个问题不存在了。

2. 第2个问题也不存在了。

3. 第3个问题,你也可以用上个方案中的方法来解决,但有更好的方法。那就是要用到中文字符的头文件和源文件开头加上MSVC的一个宏:

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
这个宏告诉MSVC,执行字符集是UTF-8编码的,别瞎整成GB2312的!还有个好处,就是能用tr包中文,方便日后的翻译

添加后,解决问题。

3 进一步探究

在尝试的过程中,我也尝试了刘典武大神的方法,在head.h中加入

#pragma execution_character_set("utf-8")

在出现中文的代码文件中,加入该头文件的引用,依然可以解决问题。

Qt 应用程序输出中文乱码+UI界面输出中文乱码相关推荐

  1. 使用matlab编写人脸识别的程序,并制作UI界面

    使用 MATLAB 编写人脸识别程序可以使用 MATLAB 自带的图像处理工具箱,如 Image Processing Toolbox 来实现. 首先,需要导入人脸数据库并进行预处理,包括对图像进行预 ...

  2. “vs+qt“点击项目目录下ui界面文件,停留短暂时间后闪退,显示xxx.ui文件无法打开。

    解决方法: 右击xxx.ui文件选择"打开方式" 选择"添加"在添加"程序"中选择designer.exe重新添加 可对友好名称重新命名,点 ...

  3. 【QT】Qt项目demo:数据在ui界面上显示,鼠标双击可弹窗显示具体信息

    一.项目总览 二.运行结果 I.鼠标单击 II.鼠标双击 三.源文件代码 1.RecData.pro #------------------------------------------------ ...

  4. Pyqt5在程序中动态修改多界面的语言(英语转中文或者中文转英语)

    继上次写完<如何用Pyqt5实现在程序中动态修改界面的语言(英语转中文或者中文转英语)>一文后,有的朋友提出希望在多个界面中实现动态修改界面语言,而我上次写的文章只能实现主界面的动态语言的 ...

  5. PyQt5 图形界面-用Qt Designer来设计UI界面,并转化为python代码运行实例演示

    Qt Designer 是 Qt Creater 程序里的一个功能. PyQt5 是把 Qt Designer 设计的界面转化为 python 代码的库. 请看这篇文章: Qt Creater.PyQ ...

  6. qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...

    本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...

  7. WIN7系统程序放在中文文件夹打开报错及界面汉字变乱码

    今天发现在一个服务商提供的设备的WIN7系统里,一个稳定运行的程序打开时报错,且界面汉字变乱码. 经测试发现程序放在英文名称的文件夹中可以正常打开,但界面上的汉字仍为乱码. 后检查"控制面板 ...

  8. Qt 5.12.10 用Design ui 设计界面,连续输入中文时,变成英文输入

    情景: Qt 版本:Qt5.12.10 问题: 使用ui设计器设计界面时,如果连续输入中文,会变成英文,无法正常输入中文. 解决办法:在界面输入中文后,实时保存下,然后继续输入中文,情况有所改善.具体 ...

  9. qt项目中的某一个类的输出中文信息乱码,其它类中文输出正常

    问题描述 qtcreate5.13.2中整个项目中通过添加头文件,使用qDebug()输出中文打印信息,输出中文都是正常的,但是有一个类的输出中文是乱码. 解决方法 修改该类的编码格式.由于项目默认采 ...

最新文章

  1. Maven 修改本地存储库位置--转
  2. 解决RHEL sendmail服务启动慢
  3. NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用
  4. LightGBM参数的贝叶斯搜索(有boost_from_average参数设置)
  5. 在vue项目中引用element-ui时 让el-input 获取焦点的方法
  6. 调试系列1:bugreport源码篇
  7. PowerDesigner 表格导出为excel
  8. day 32 半链接、粘包问题、finally
  9. 计算机英语二国家线,历年考研英语国家线一览表
  10. MongoDB World 2016参会全记录
  11. 飞腾D20008核桌面处理器
  12. JS clientX、offsetX、pageX、screenX
  13. Python 海龟绘图:turtle库的使用
  14. 9个开源的 Vue3 组件库
  15. 洛谷 1875 佳佳的魔法药水
  16. 阿里云服务器 Certbot 申请 LetsEncrypt 泛域名免费证书,并实现自动续订
  17. C语言编程入门之--第一章初识程序
  18. 列表2:查询复制函数实操
  19. 最大机枪池被黑客攻击,BSC接连被暴击后将走向何方?
  20. C语言实验报告承诺书怎么写,北方民族大学c语言实验习题.pdf

热门文章

  1. Redis主从配置详细流程
  2. 【Python】浅谈 字节码 + 虚拟机 (Python 解释器)
  3. 详解科大讯飞语音识别
  4. 哈夫曼编码的简单实例
  5. 数据库管理工具 FreeSQL
  6. 关于星环TDH产品的Java通过Kerberos安全认证连接hyperbase
  7. BUUCTF-[HCTF 2018]admin1
  8. 温度补偿计算公式_温度补偿的方法
  9. 向下取整floor()、向上取整ceil()、截取函数trunc()、四舍五入round()
  10. MATLAB图像基本操作(信息查询/文件读取/写入/显示)