Qt 5中文乱码问题完美解决方案

2023-11-15

乱码问题概述

使用Qt的时候,时常会遇到中文乱码问题,qDebug打印日志乱码,或者Widget界面乱码等等。

原因呢,大多是因为使用MSVC编译器问题导致,而Qt 自带的MinGW一般不会出现乱码问题。

核心原因呢,是因为编码问题,即UTF-8和GBK编码千古疑难问题

使用MSVC编译器输出中文的问题

在 Qt Creator 中使用 MSVC 编译器编译项目时,若处理不当容易出现中文字符串乱码问题。
例如,程序运行时,LabInfo显示的汉字就会出现乱码。

void MainWindow::Changed()
{
	QString str="测试";
	ui->LabInfo->setText(str);
} 

这是因为Qt Creator保存的文件使用的是UTF-8编码(是任何平台、任何语言都可以使用的跨平台的字符集),MSVC编译器虽然可以正常编译带BOM的UTF-8编码的源文件,但是生成的可执行文件的编码是 Windows 本地字符集,比如 GBK2312。

也就是在可执行文件中,字符串“测试”是以GBK2312编码的,而可执行程序执行到这条语句时,对这个字符串却是以UTF-8解码的,这样就会出现乱码。

解决方案

纯Qt环境

解决这个问题有两种方法

一种方法是使用 QStringLiteral()宏或者QString::fromLocal8Bit()封装字符串,另一种方法是强制 MSVC 编译器生成的可执行文件使用UTF-8编码。

1. 方案一

QStringLiteral(str)宏在编译时将一个字符串 str 生成字符串数据,并且存储在编译后文件的只读数据段中,程序运行时使用到此字符串时,只需读出此字符串数据即可。

所以程序中需要使用QStringLiteral()宏对每个中文字符串进行封装,代码可改为:

QString str = QStringLiteral("测试");

缺陷:

需要对每个含有中文的字符串进行封装,而且tr()函数无法使用(无国际化翻译需求可忽略)

方案二

强制 MSVC 编译器采用 UTF-8 编码生成可执行文件,需要在每个使用到中文字符串的头文件和源程序文件的前部加入如下的语句:

#if _MSC_VER >= 1600 //VS2015>VS>VS2010, MSVC VER= 10.0 -14.0
#pragma execution_character_set("utf-8")
#endif

VS 2010-VS 2015 Update2的编译器可以使用此方案,这是强制编译后的执行文件采用UTF-8编码。这样,即使不再使用QStringLiteral()宏,程序运行时也不会再出现汉字乱码的问题了。而且,也可以采用tr()函数用于翻译字符串。

个人认为最优方案:

在pro文件中添加

msvc{
    QMAKE_CFLAGS += /utf-8
    QMAKE_CXXFLAGS += /utf-8
}

或者

msvc{
    QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
}

execution-charest表示执行字符集。source-charset表示源码字符集
两种方式都可以

注意:msvc必须是小写,亲测大写MSVC无效。另外,运行之前,建议清除一下,重新构建,删除之前的缓存。

VS +Qt环境编码问题解决

一般而言,不会乱码,因为文本,编译器都是GBK编码。但是为了更好的跨平台兼容性,改为UTF-8编码的话,就需要做一些改动了。

  1. 首先需要将文本设置为UTF-8格式
    这里就不再介绍了,具体方案可参考VS2019 编码问题,如何完美改为UTF-8
  2. 在项目属性-C/C+±命令行-其他选项下面加入/utf-8

测试发现,使用VS2019,用纯Qt方案二的_MSC_VER宏也可以解决乱码问题。

参考链接

/utf-8

execution_character_set

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 5中文乱码问题完美解决方案 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • DNS域名服务器详解

    一 DNS DNS Domain Name System 是域名系统的英文缩写 是一种组织成域层次结构的计算机和网络服务命名系统 用于 TCP IP 网络 二 域名系统DNS的作用 通常我们有两种方式识别主机 通过主机名或者 IP 地址 人
  • Java 内存区域和GC机制

    Java垃圾回收概况 Java GC Garbage Collection 垃圾收集 垃圾回收 机制 是Java与C C的主要区别之一 作为Java开发者 一般不需要专门编写内存回收和垃圾清理代码 对内存泄露和溢出的问题 也不需要像C程序员
  • JS中的delete

    delete 操作符用于删除对象的某个属性 如果没有指向这个属性的引用 那它最终会被释放 语法 delete expression expression 的计算结果应该是某个属性的引用 例如 delete object property d
  • 网络协议、socket、webSocket

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 一 网络协议 网络协议为 计算机网络中进行数据交换而建
  • ckeditor粘贴word图片且图片文件自动上传插件

    如何做到 ueditor批量上传word图片 1 前端引用代码
  • C语言编译随机抽数字小游戏

    C语言随机猜数字游戏编写 所用函数类型 rand函数 1 含义 随机生成一个伪随机值 但是只能生成一个固定的随机值 因为它是根据一个固定的 种子 来生成的 仅是自我理解 如有错误或者补充 请帮我指出谢谢 2 使用这个函数时需要搭配 incl
  • 调节pycharm字体大小

    1 打开PyCharm 单击 File 2 然后 选择Settings 会打开一个弹窗 3 接着选中弹窗中的Editor 4 然后 选中Font 5 改变Size值的大小 就可以调节字体大小了
  • apache启服务命令_Linux系统重启apache服务命令详解

    Linux系统中apache是重要的一个服务 掌握基本操作尤其重要 下面由学习啦小编为大家整理了Linux系统重启apache服务命令详解 希望对大家有帮助 Linux系统重启apache服务命令详解 基本的操作方法 本文假设你的apahc
  • [Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)

    该系列文章是讲解Python OpenCV图像处理知识 前期主要讲解图像入门 OpenCV基础用法 中期讲解图像处理的各种算法 包括图像锐化算子 图像增强技术 图像分割等 后期结合深度学习研究图像识别 图像分类应用 希望文章对您有所帮助 如
  • 常见软硬件交互放方案

    列举遇到的软硬件交互需求及解决方案 1 照片墙 解决内容 照片排版 位置 大小 样式 默认滚动 多人交互 分区 无限循环 便捷替换照片 点赞功能 2 人脸融合 解决内容 API接入 原始照片 保存 展示 3 AR识别讲解 解决内容 AR识别
  • bugku where is flag 4杂项

    1 base64解码 下载压缩包下来解压打开 发现里面是base64加密 在kali中解码 去掉所有换行符 用winhex打开 发现十六进制的奇数位正好可以构成zip的文件头 504b 2 脚本编写 写个python脚本提取奇数位 str1
  • RHEL7 中配置 IPv6 练习

    试验环境 RHCE Server 虚拟机 以配置好 视频中配套的所有环境 包含View Server View Desktop 等 视频中的示例一般是在 server0 主机上做 登陆命令为 ssh X root server0 重置 se
  • Java教程:Javadoc(文档注释)详解

    本篇文章由 泉州SEO www 234yp com 整理发布 Java教程 www 234yp com Article 198092 html 谢谢合作 Java教程Java 支持 3 种注释 分别是单行注释 多行注释和文档注释 文档注释以
  • js基础语句

    一 if else 条件判断语句 var num 1 if num 1 console log 壹 else if num 2 console log 贰 else num 3 console log 参 输出 壹 二 switch cas
  • Dockerfile自定义镜像 - 基于 java:8-alpine 镜像,将一个Java项目构建为镜像

    目录 一 前置知识 1 镜像结构 2 Dockerfile是什么 二 自定义一个 java 项目镜像 1 创建一个空目录 在这个空目录中创建一个文件 命名为 DockerFile 最后将 java 项目打包成 jar 包 放到这个目录中 2
  • Python 绘画excel分组柱状图(懒人学习)

    1 excel案例如截图 很简单大家自己照着做一个就可以了 2 完整代码如下 import pandas as pd import matplotlib pyplot as plt students pd read excel H Pyth
  • Python视觉摄像头检测有趣项目(一)(重点)

    转载自就是这个七 https blog csdn net qq 42633819 article details 81191308 利用python tensorflow opencv实现人脸识别 对于环境安装就是在Win10上对于Tens
  • C# 实现预览dwg文件完整源代码(无需autocad环境)

    using System using System Drawing using System Collections using System ComponentModel using System Windows Forms using
  • C++ 多态与虚函数

    多态性与虚函数 多态性 虚函数 多态性 多态性是面向对象程序设计的关键技术之一 若程序设计语言不支持多态性 不能称为面向对象的语言 利用多态性技术 可以调用同一个函数名的函数 实现完全不同的功能 在C 中有两种多态性 编译时的多态 通过函数
  • Qt 5中文乱码问题完美解决方案

    乱码问题概述 使用Qt的时候 时常会遇到中文乱码问题 qDebug打印日志乱码 或者Widget界面乱码等等 原因呢 大多是因为使用MSVC编译器问题导致 而Qt 自带的MinGW一般不会出现乱码问题 核心原因呢 是因为编码问题 即UTF