VS2022 + Qt5.9 中文乱码/项目设置utf-8编码

🛠️ 解决QT5.9 + VS2022中文乱码的全面方案

📁 1. 检查文件编码与编译器设置

确保源文件是 带BOM的UTF-8 编码对MSVC编译器很重要。VS2022默认可能使用本地编码(如GB2312)解析源文件,即使文件以UTF-8保存。

  • 查看和设置文件编码:在VS2022中,可以通过 “文件” -> “高级保存选项” 来确认和设置当前文件的编码为 “Unicode (UTF-8 带签名) - 代码页 65001”。如果“文件”菜单中没有“高级保存选项”,可以通过 “工具” -> “自定义” -> “命令” -> “菜单栏” 选择“文件”,点击“添加命令”,在“文件”类别中找到并添加“高级保存选项”。
  • 强制编译器使用UTF-8:在项目属性中设置编译器使用UTF-8编码。
    • 右键点击项目 -> “属性”
    • 进入 “配置属性” -> “C/C++” -> “命令行”
    • “其他选项” 中添加 /utf-8

⚙️ 2. 项目属性配置

在VS2022中配置项目属性,以确保从编译到链接各个环节都能正确处理UTF-8编码。

  1. 右键单击你的Qt项目,选择 “属性”
  2. “配置属性” -> “C/C++” -> “命令行” 的“其他选项”中,添加 /utf-8
  3. 确保你的项目配置文件(如 .vcxproj)中没有其他字符集相关的冲突设置。

🔧 3. 代码层面的修改

使用 QStringLiteral

QStringLiteral 宏可以在编译期将字符串字面量转换为 QString 对象,并正确处理UTF-8编码,避免运行时转换开销和乱码问题。

// 修改前
QPushButton* button = new QPushButton(QString("点击我"), this);// 修改后
QPushButton* button = new QPushButton(QStringLiteral("点击我"), this);

使用 tr() 函数进行国际化

对于用户界面中的字符串,建议使用 tr() 函数,它不仅可以标记需要翻译的字符串,也在一定程度上有助于Qt的字符串处理系统正确识别编码。

QMessageBox::information(this, QStringLiteral("标题"), tr("你点击了按钮"));
// 注意:tr() 函数本身通常用于国际化,其源字符串也需要确保编码正确。
// 如果使用 tr(), 对应的字符串应出现在 .ts 翻译文件中,并由 lrelease 工具处理。

显式指定字符串编码

如果以上方法仍有问题,可以尝试使用 QString::fromUtf8() 进行显式转换。

QPushButton* button = new QPushButton(QString::fromUtf8("点击我"), this);
...
QMessageBox::information(this, QString::fromUtf8("标题"), QString::fromUtf8("你点击了按钮"));

🌐 4. 设置应用程序默认编码

main 函数中,设置应用程序的默认编码为 UTF-8。请注意,在 Qt5 中,QTextCodec::setCodecForLocale 等函数已被弃用,但在某些情况下,明确设置编码可能仍有帮助。

#include <QApplication>
#include <QTextCodec> // 如果使用Qt5,注意某些函数已弃用int main(int argc, char *argv[])
{QApplication a(argc, argv);// 设置应用程序默认使用 UTF-8 编码// 在Qt5.9中,以下函数可能可用,但请注意Qt5中这些函数已标记为废弃// 在Qt6中,这些函数已被移除
#if QT_VERSION <= QT_VERSION_CHECK(6,0,0)QTextCodec *codec = QTextCodec::codecForName("UTF-8");QTextCodec::setCodecForLocale(codec);// 注意:setCodecForCStrings 和 setCodecForTr 在 Qt5 中已移除。
#endif// ... 你的其他代码 ...return a.exec();
}

重要提醒QTextCodec::setCodecForLocale 在 Qt5 中已废弃,且在 Qt6 中完全移除。对于新项目,建议优先采用前述方法一和方法二。

📝 用户代码修改示例

根据以上建议,你的代码可以修改为:

// 根据需要包含头文件,例如可能需要 #include <QTextCodec>QPushButton* button = new QPushButton(QStringLiteral("点击我"), this);
button->setGeometry(100, 100, 100, 30);
connect(button, &QPushButton::clicked, [=]() {QMessageBox::information(this, QStringLiteral("标题"), QStringLiteral("你点击了按钮"));// 如果为了国际化,并且已经配置好翻译系统,也可以使用 tr()// QMessageBox::information(this, tr("Title"), tr("You clicked the button."));
});

💎 核心解决思路汇总

环节推荐设置注意事项
文件编码带BOM的UTF-8在VS2022中通过“高级保存选项”设置。
编译器设置项目属性 -> C/C++ -> 命令行 -> 其他选项:/utf-8确保编译器正确理解源文件编码。
字符串处理使用 QStringLiteral编译期创建QString,避免乱码。
国际化使用 tr() 函数方便后续国际化,并可能减少编码问题。
应用程序编码QTextCodec::setCodecForLocale (Qt5)注意:Qt5中已废弃,Qt6中已移除。仅在必要时使用,并注意兼容性。

希望这些方法能帮助你解决中文乱码问题。如果在尝试后问题依旧,或者你在实践中遇到了其他情况,欢迎随时告诉我。

VS 里边安装插件【Force UTF8】拓展

【无BOM版(推荐)】
https://marketplace.visualstudio.com/items?itemName=hbuexinxin.Fo

rceUTF8NoBOM
【带BOM版】
https://marketplace.visualstudio.com/items?itemName=jz5.ForceUTF8withBOM-18593

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98813.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库--MySQL数据管理

数据库–MySQL数据管理 文章目录数据库--MySQL数据管理1.外键管理2.数据库数据管理3.DML语言3.1添加数据3.2修改数据3.3删除数据4.练习1.外键管理 外键概念 如果公共关键字在一个关系中是主关键字&#xff0c;那么这个公共关键字被称为另一个关系的外键。由此可见&#xff0c;…

【C++练习】13.C++输出九九乘法表的方法详解

目录 C++输出九九乘法表的方法详解 方法1:双重for循环(最基础) 思考: 代码分析: 特点: 方法2:使用while循环 思考: 代码分析: 特点: 方法3:使用递归实现 思考: 代码分析: 特点: 方法4:格式化输出(对齐美观) 思考: 代码分析: 特点: 方法5:使用函数封装 思考…

MVC及其衍生

MVC 把软件分成模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三个基本部分。 事实上对应着 Controller——输入 用户交互&#xff0c;将输入处理成Controller能处理的形式 Model——处理 描述状态、逻辑规律…

微硕WINSOK MOS管WSF3089,赋能汽车转向系统安全升级

随着汽车电子化程度不断提高&#xff0c;转向系统对高效功率器件的需求日益增长。微硕WINSOK推出的N沟道Trench MOS管WSF3089&#xff0c;以30 V/72 A大电流、4.5 mΩ超低导通电阻和TO-252-2L紧凑封装&#xff0c;为EPS&#xff08;电动助力转向&#xff09;电机驱动、电源管理…

淘宝拍立淘接口的接入与应用||item_search_img-按图搜索淘宝商品(拍立淘)

淘宝拍立淘接口的接入与应用如下&#xff1a;接入流程注册与认证&#xff1a;开发者账号注册&#xff1a;访问淘宝开放平台&#xff0c;进行开发者账号注册。创建应用&#xff1a;在控制台创建新应用&#xff0c;获取 App Key 和 App Secret&#xff0c;这是接口调用的凭证。申…

Python学习-day8 元组tuple

元组&#xff08;Tuple&#xff09;是Python中一种不可变的序列类型&#xff0c;用于存储多个有序元素。与列表&#xff08;List&#xff09;类似&#xff0c;但元组一旦创建后不能修改&#xff08;不可添加、删除或修改元素&#xff09;&#xff0c;这使得它在安全性、性能优化…

大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

二次学习C语言补充2

文章目录表栈、队列、二叉树一、二叉树二、表栈三、队列链表一、单向链表二、循环链表、双向链表和双向循环链表预处理一、预处理二、宏定义文件文件操作补充本篇文章是对二次学习C语言12——文件操作 二次学习C语言14——预处理及模块化 二次学习C语言15——链表 二次学习C语言…

2.9Vue创建项目(组件)的补充

1.再创建和引入vue的选择2.VsCode插件 安装Vue自己搜索最新的3.style自己的作用域在一个组件中引入另一个文件的子组件&#xff0c;给当前组件设置样式&#xff0c;那么子组件的样式也会改变的。为了解决这个问题 我们在自己的style中设置一个属性4.另一种创建vue 的方式(主流…

算法高频题

刷题&#xff1a;LeetCode&#xff08;Top 100-150题&#xff0c;至少刷两遍&#xff09;。重点&#xff1a;链表、树、二分查找、动态规划、回溯、栈/队列。 每一个题型&#xff0c;前10个高频题 算法思考框架参考&#xff1a;算法题思维框架-CSDN博客 高频顺序参考网站&…

服务器安装 LDOPE(MODIS 数据处理工具)

目录下载方式1-&#xff08;简单快捷&#xff09;根据WRF-VPRM 需要打补丁下载方式2&#xff1a;&#xff08;手动安装依赖&#xff09;一、安装所需依赖库&#xff08;4 个主库 2 个基础库&#xff09;另- HDF-EOS 手动编译二、解压并安装 LDOPE参考下载方式1-&#xff08;简…

克隆代币 + 捆绑开盘:多链环境下的低成本发币玩法

在加密世界&#xff0c;发币已经不再是“少数开发者的专利”。随着工具的普及&#xff0c;任何人都可以快速发行一个在加密世界&#xff0c;发币已经不再是“少数开发者的专利”。随着工具的普及&#xff0c;任何人都可以快速发行一个代币。但问题是&#xff1a;如何在保证低成…

数据结构中的 二叉树

1.前言 在 Java 中&#xff0c;树&#xff08;Tree&#xff09;是一种非线性数据结构&#xff0c;由节点&#xff08;Node&#xff09;组成&#xff0c;常见的线性表则是我们之前学过的顺序表、链表、栈、队列等等。每个节点包含数据和指向子节点的引用。树的常见实现方式包括二…

IntelliJ IDEA 启动项目时配置端口指南

&#x1f31f; 一、为什么需要手动设置启动端口&#xff1f; 默认情况下&#xff0c;Spring Boot 应用会使用 8080 端口启动。但在以下场景中&#xff0c;我们必须自定义端口&#xff1a; 多个微服务同时运行&#xff0c;需避免端口冲突&#xff1b;团队协作开发&#xff0c;统…

spark sql之from_json函数

目录前言函数语法参数说明返回值案例案例1案例2前言 在Spark SQL中&#xff0c;from_json函数用于解析包含JSON字符串的列&#xff0c;并将其转换为Spark SQL的结构化类型&#xff08;如struct、map或array&#xff09; 函数语法 from_json(jsonStr, schema [, options])参数…

数据结构 之 【位图的简介】

目录 1.位图的引入 2.位图概念 3.位图的实现 3.1前提准备 3.2set 3.3reset 3.4test 4.位图的应用 1.位图的引入 给40亿个不重复的无符号整数&#xff0c;没排过序 再给一个无符号整数&#xff0c;如何快速判断这个无符号整数是否在 这40亿个数中 首先&#xff0c;一个…

[iOS] ViewController 的生命周期

文章目录前言一、UIViewController 生命周期有关函数二、UIViewController 中函数的执行顺序运行结果1.present和dismiss2.push和pop三、总结前言 UIViewController 是在 iOS 开发中一个非常重要的角色&#xff0c;他是 view 和 model 的桥梁&#xff0c;通过 UIViewControlle…

第30章 零售与电商AI应用

本章将深入探讨人工智能在零售与电商领域的革命性应用。我们将从智能推荐系统、动态定价、库存管理到创新的虚拟试衣间&#xff0c;全面解析AI如何重塑购物体验和商业运营效率&#xff0c;并为每个关键技术点提供代码实战&#xff0c;帮助你掌握将AI应用于真实商业场景的能力。…

QT通过QModbusRtuSerialMaster读写电子秤数据实例

一、电子称常用功能&#xff1a;称重、清零、去皮&#xff1b;电子秤的通讯方式&#xff1a;Modbus通信、串口通信。二、QT读写电子秤软件界面如下&#xff1a;三、核心代码如下&#xff1a;.pro项目文件代码&#xff1a;QT core gui serialbus serialport.h头文件代码#…

sqlmap常用命令

ZZHow(ZZHow1024) 一、扫描注入点 1.GET方法&#xff0c;给URL&#xff1a; #探测该url是否存在漏洞 python sqlmap.py -u "http://192.168.10.1/sqli/Less-1/?id1"#如果我们已经知道admin这里是注入点的话&#xff0c;可以在其后面加个*来让sqlmap对其注入 python …