C++项目相关的字符编码有:
- 代码字符编码:即源代码文件使用的字符编码,一般通过IDE可查看;
- 编译器使用的字符编码:windows上MSVC默认使用的是当前系统设置的编码,中文系统默认是GBK;
- C++运行时字符编码:指程序运行过程中内存中变量的字符编码,可通过配置编译器修改默认编码,也可以通过字符串操作函数来修改具体变量的编码方式;
- 控制台显示字符编码:一般同系统当前设置;
- 第三方库使用的编码:如QT项目有QT字符串的字符编码,QT5的默认编码是UTF-8。
其中任何两项不匹配,都可能在相应的地方造成乱码,所以排查的思路就是检查各种编码是否一致。一般来说常见的编码不一致的情况有下面两种:
1.编译器编码和实际代码文件编码不一致
这种情况下,如果代码中有中文字符,则在编译过程就会出现乱码,后续的所有相关操作当然也会是乱码。解决方案是改变其中一种编码,一般不推荐修改系统默认的编码,所以解决方案推荐设置指定编译器的编码:
例如,使用cmake配置设置MSVC编译源码时使用的编码为gbk
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:gbk>")
2.运行时编码与第三方库使用的编码不一致
这也是常见的编码出问题的地方。解决方案也是将二者设置一致
例如,使用cmake配置设置MSVC编译后的程序运行时编码为utf-8
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/execution-charset:utf-8>")
如果是QT项目,通过以下代码,来设置QT字符串的编码
QTextCodec* codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
以上就是一个windows中文系统用VS作为IDE的QT项目编码的设置:
源码(gbk) <----> 编译时(gbk) <----> 运行时(utf-8) <----> QT变量(utf-8)