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();
}