1、系统默认控制台命令行编码
windows命令行默认的编码是ANSI,中文系统下则就是GBK,GBK是对GB2312编码的扩展兼容GB2312,可以等同理解为就是GB2312。
2、vs2022默认新建项目编码
vs默认项目文件编码格式为UTF-8 BOM
默认字符集 Unicode
最终在默认命令行解析为gb2312编码的字符串,正确显示未乱码,但字符串不是UTF-8编码
3、vs指定执行字符集的两种方法:/utf-8编译选项和旧宏
新编译选项会覆盖旧宏,所有新编译选项等同于新编译选项+旧宏,vs2015及以后版本建议用新编译选项即可。
旧宏:#pragma execution_character_set("utf-8")
新编译选项:/utf-8
对于C++项目,/utf-8编译选项的支持是从Visual Studio2015版开始,位置如下图,/utf-8
选项将源字符集和执行字符集指定为使用 UTF-8 编码的字符集。
4、源码文件编码为UTF-8时,三种情况如下:
4.1、UTF-8 未指定
源码文件格式为UTF-8
默认字符集unicode
默认命令行输出为乱码,虽已被解析为utf-8但末尾\n也被解析成字符串
4.2、UTF-8 使用新编译选项/utf-8(包含新编译选项+旧宏)
源码文件格式为UTF-8
默认字符集unicode
命令行默认编码输出为乱码但实际为正确utf-8字符串
依据:在命令行utf-8编码模式下输出正确字符串
4.3、UTF-8 指定执行字符集旧宏
第5行使用旧宏#pragma execution_character_set("utf-8")
文件编码格式为UTF-8
默认命令行输出为乱码且为不可读字符串
5、源文件编码为UTF-8 bom时,三种情况如下:
5.1、UTF-8 bom未指定
源码文件格式为UTF-8 bom
默认字符集unicode
默认命令行输出被解析为gb2312的字符虽未乱码但不是utf-8
5.2、UTF-8 bom使用新编译选项/utf-8 (包含新编译选项+旧宏情况)
源码文件格式为UTF-8 bom
默认字符集unicode
默认命令行输出乱码,但已经被解析为标准UTF-8编码的字符串;
(因为命令行默认为改变2312所有看似乱码,实际乱码内容对应在4.2图2中演示过)
5.3、 UTF-8 bom使用旧宏
源码文件格式为UTF-8 bom
默认字符集unicode
默认命令行输出乱码,但也已经被解析为标准UTF-8编码的字符串;
6、汇总
7、总结
本篇讨论的重点是采用什么编码格式对输出的格式要清楚否则越转越乱。
1、微软还是那个bom派,UTF-8 bom支持了两种输出情况, 默认支持无需宏但输出解析为gb2312,另一种加宏或者/utf-8选项都会解析为标准utf-8;
2、标准utf-8项目,也就是不带bom的utf-8,别挣扎了就一种情况,编译选项/utf-8加上,输出就是utf-8,仅有此种方式靠谱统一;