VS2019 visual studio 终端调试乱码问题


目录
  • 几个相关概念
  • 查看和修改终端编码
    • 方法1:客户端查看
    • 方法2:终端命令查看
    • 方法3:注册表
  • VS中查看和修改文件编码
    • Notepad++ 查看和修改
    • Sublime查看和修改
  • 解决 visual studio 乱码
    • 【问题分析】

作者使用 VS2019 调试 python 程序时,终端打印中文出现乱码。本文收集了网络上解释,发现缺乏系统阐述,且每个解决均缺乏相关背景概念,不利于遇到同样问题的用户排查问题,因此在这里整理了和乱码相关的概念,终端编码和文本编码查看和修改方法。最后对比了常见的乱码解决方法。

几个相关概念

  1. "字符集"是字符到其标识代码值的映射。

  2. 传统字符集是前面的字符编码标准,如使用8位代码值或8位值组合来表示特定语言或地理区域中使用的字符的 Windows代码页。

  3. Unicode 是一种全球字符编码标准,当今计算机中最常用的字符集,新的 Windows 应用程序应使用 Unicode 来避免不同代码页的不一致,并有助于简化本地化。

  4. 双字节代码标志,unicode 在windows应用程序使用 UTF-16 实现,由双字节代码标识。

  5. 代码页,大多数编写的应用程序都以 Unicode的形式使用 utf-16 编码来处理字符数据。 但是,许多旧版应用程序将继续使用基于代码页的字符集。

    表1:代码页标志符

    标志符 .net 名称 其他信息
    936 gb2312 ANSI/OEM 简体中文 (中国、新加坡) ;简体中文 (GB2312)
    65001 utf-8 Unicode (UTF-8)
  6. 旧版本控制台模式,旧版控制台模式是一种兼容性工具,旨在帮助用户在 Windows 10 上运行较旧的命令行工具。 对于在默认 Windows 10 控制台体验中未正确显示或运行的任何命令行工具,此模式提供了一种粗粒度的解决方案,可将系统恢复到较旧版本的控制台托管体验。旧版本和当前版本之间的主要已知差异是 UTF-8 的实现。 旧版主机在代码页 65001上提供最基本的 UTF-8 支持[1]

查看和修改终端编码

方法1:客户端查看

  1. 打开终端,右键导航栏
  2. 点击属性,计入“选项” 页,查看当前代码页设置
更改终端代码页
图1 更改终端代码页

方法2:终端命令查看

# 使用 chcp(change code page) 查看终端编码 
C:\Users\***>chcp
Active code page: 65001
# 改变终端编码
C:\Users\***>chcp 936
Active code page: 936

方法3:注册表

通过终端修改字符集方法为临时修改,永久默认为utf-8编码格式可参考windows cmd客户端字符集编码修改

VS中查看和修改文件编码

  1. 参考为文件菜单项,添加高级保存设置
 VS 添加高级保存设置
图2 VS 添加高级保存设置
  1. 选择 Unicode (UTF-8 无签名 - 代码页655001),点击确认
 VS 高级保存选项
图3 VS 高级保存选项
3. 新建文件,就会按刚刚选择的编码保存

Notepad++ 查看和修改

 Notepad++ 查看和修改
图4 Notepad++ 编码查看和修改

Sublime查看和修改

 Sublime 编码查看和修改
图5 Sublime 编码查看和修改

解决 visual studio 乱码

系统环境: win11 22000.613
集成开发环境 : Microsoft Visual Studio Community 2019 版本 16.10.3

【问题分析】

乱码是由编码冲突引起,这种冲突发生在文本的编码、终端的编码、终端字体之间。

 Beta版:使用Unicode UTF-8 提供全球语言支持
图6 编码报错
## 【解决方案】 在 VS2019 中调试调用 CMD 终端,文本编码采用 utf-8, 调整终端编码使用 65001(Unicode (UTF-8)),文本和终端编码时一致时,问题就得到了解决。 结合网上分析,还有两种操作(==未经本人测试,若读者有新的测试或者更好的补充可在评论区中添加==):

第一种,修改终端属性,使用旧版控制台。这个作用可能是源文件编码使用旧版本 utf-8,修改成旧版,可以解决已有文件的显示问题,但不能新建文件的显示问题;
第二种,勾选区域语言-Beta版:使用Unicode UTF-8 提供全球语言支持,这个修改方案有会带来其他程序乱码问题。通过该方案奏效的情况可能是 Unicode utf-16 和 utf-8 编码冲突情形。还提到修改字体对中文显示的影响,也可以在出现乱码问题时尝试。

 Beta版:使用Unicode UTF-8 提供全球语言支持
图7 Beta版:使用Unicode UTF-8 提供全球语言支持
第一种和第二种方法,经我分析只是解决了部分已有文件的编码冲突,可能会引入其他问题,。本质上解决乱码问题,还是要核对整个流程上使用的解码方式,保证一致性,即可解决问题。
  1. https://docs.microsoft.com/zh-cn/windows/console/legacymode ??