vs2022+CMake+QT环境解决中文乱码问题

1.字符集

字符集其实就是一种将字符编码的格式,像我们常说的ASCII,UTF8,GBK都是常用的字符集。
首先,从你在编辑器里输入一个UTF8汉字开始,到最终在控制台上显示出来,整个流程涉及到三个概念,分别是源码字符集,执行字符集,解析字符集。

  • 源码字符集:
      就是你的源代码文本文件的字符集。
  • 执行字符集:
    在C++里 char* str= “我”,执行字符集决定了这行代码在编译器进行编译的时候str存储的字节到底是什么,你可能会说源码字符集不是已经决定了这个”我”的二进制表示了么,没错,但是这个执行字符集就是让你在这里对它再解释一次。比如我源码字符集可能是UTF8的,但是我可以通过执行字符集来让最终ptr存储的是GBK的字节编码。
  • 解析字符集:
    最终要还原显示这些二进制字节编码的时候,就需要用到它。比如通过printf把前面的str显示到控制台时,这个printf就会按照解析字符集来解析这些字节编码,找到指定字符显示出来。
      饶了一圈,好像也不是很乱,但是这里面是有很多坑的。这几个字符集的处理都是跟具体编译器甚至操作系统相关的,不同的编译器是有差别的。

2.VS2022使用UTF-8编码方式保存源码

用过Linux和Mac的同学都知道,在Linux和Mac环境下,源码的默认字符集是UTF-8,只有微软默认使用的是GBK(反人类),我们使用Visual studio开发程序时经常会遇到编码问题,其实Visual studio也可以通过插件来强制使源码使用UTF-8的编码方式保存,以下就是配置过程。以vs2022为例。

2.1 Force UTF-8(No BOM)安装

在vs菜单栏找到扩展,然后点击管理扩展,在浏览中搜索Force UTF-8(No BOM),点击安装,安装完成后,依次打开你的源码文件,重新保存下,此时你的源码都被改为了UTF-8编码了。

在这里插入图片描述

2.2 Cmake配置

在CMake中添加以下代码add_compile_options(/source-charset:utf-8 /execution-charset:utf-8)告诉编译器,源码是UTF-8的编码方式进行编码,执行字符集也使用UTF-8编码方式。

if(MSVC)
	# MSVC环境下告诉编译器源码使用UTF-8字符,编译时也使用UTF-8进行编译
	add_compile_options(
		/GS-	#禁用安全检测
		/source-charset:utf-8 /execution-charset:utf-8
	)
endif()

2.3 QT程序使用UTF-8编码

在程序开始部分添加 QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));告诉程序使用Utf-8的编码方式进行解析字符。

int main(int argc, char* argv[]) {  
    //创建QT应用程序对象
    QApplication app(argc, argv);
	// 使程序中的中文以UTF-8编码方式进行编码
	QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
   	...
    return app.exec();
}

三、控制台中文乱码解决

使用system(“CHCP 65001”);指令告诉Windows控制台使用UTF-8的编码方式输出。

int main(int argc, char* argv[]) { 
#if _WIN32
	system("CHCP 65001");
#endif // MSVC 
    //创建QT应用程序对象
    QApplication app(argc, argv);
	// 使程序中的中文以UTF-8编码方式进行编码
	QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
   	...
    return app.exec();
}

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值