最近更新于 2024-03-17 13:30

1 测试环境

我这里在

  • Windows 11 专业版 23H2 中文版
  • PowerShell 7.4.1
    中,默认的字符编码是 936 GB2312
    file

官方的标识码解释:https://learn.microsoft.com/zh-cn/windows/win32/Intl/code-page-identifiers
file

  • Visual Studio 2022

2 中文乱码出现的原因

出现乱码通常就是记录的规则和阅读的规则不一样导致的,举一个例子,我在纸上写了四个字“女子弓虽”,如果别人读的时候是把我的每两个字当作一个字,那么读取出来就是“好强”,乱码产生大致就是相似的原因。解决乱码的问题就在于保证每个阶段都是用的匹配的规则。

3 UTF-8 源码执行乱码的解决方案

在 Linux 中及其它很多领域的开发中 UTF-8 编码基本成为规范,在 Windows 中则可能出现问题。上面也提到了,中文版的终端编码是 GB2312,在保证源码是 UTF-8 的情况下,又要保证终端正常显示中文,考虑到两类方法:一种是将终端编码改 UTF-8,参考 https://blog.iyatt.com/?p=3437 ;第二种是让编译器来适应。
第一种方式,当前我是遇到了问题(前两年用的时候不记得有这个问题)。源码采用 UTF-8,MSVC 编译参数加或者不加 /utf-8,终端不管是 GB2312 还是 UTF-8,中文都出现乱码,但是如果源码采用 UTF-8 Bom 又没有问题,都能正常显示。
第二种方式,让 MSVC 按照 UTF-8 来处理源码,但是执行的时候按照 GB2312,这样就不会出现乱码了。给 MSVC 加上编译参数

/source-charset:utf-8 /execution-charset:gb2312

基于 VS 管理的项目的话,在项目名上右键打开属性,C/C++ -> 命令行 -> 其他选项 中加上
file

基于 CMake 管理的项目的话,用 add_compile_options 添加编译参数就行
file

前面提到的 /utf-8 就相当于是 /source-charset:utf-8 /execution-charset:utf-8


用 VScode 的时候默认编码就是 UTF-8,修改也十分方便,但是调试还得是 VS 强大,必不可少的使用 VS,而 VS 的编码自动适应控制台,手动指定会比较麻烦。
可以添加强制 UTF-8 保存的插件 Force UTF-8 (No BOM)
file

file