我们在Windows使用VSCode编写C/C++程序时,如果代码中的中文字符串使用的是UTF8编码,且代码内没有设置控制台的输出编码,或者编译时没有指定运行时编码(GCC可以在编译时使用-fexec-charset=GBK来指定运行时的字符串编码;clang目前只能是utf-8),则在调试或者运行时,VSCode控制台输出的中文字符可能会为乱码。

目前VSCode中微软官方出品的cppdbg引擎已经是可以正常输出UTF-8字符,不管是使用gdb还是lldb。不过cppdbg引擎使用lldb调试器时,不是直接调用的LLDB API,而是使用的lldb-milldb-mi项目已经很久没人维护了,基本上处于停滞状态。如果想要使用lldb调试器,可以使用CodeLLDB插件,不过该插件是直接使用的Windows的控制台,Windows控制台默认是使用的GBK编码,代码输出UTF8编码的字符串就会出现乱码。

为了一劳永逸地解决VSCode中控制台输出UTF8字符串时乱码的问题,可以在settings.json中添加如下配置:

 1"terminal.integrated.profiles.windows": {
 2    "Command Prompt": {
 3      "path": [
 4        "${env:windir}\\Sysnative\\cmd.exe",
 5        "${env:windir}\\System32\\cmd.exe"
 6      ],
 7      // CodeLLDB插件,打开此项解决中文输出乱码问题
 8      "args": ["/K", "chcp 65001>nul"],
 9      "icon": "terminal-cmd"
10    }
11}

即在cmd命令行后添加/K chcp 65001>nul或者/K chcp 65001,这样VSCode中启动的控制台全部会使用UTF8编码输出。

注意:这样配置后,会有点冲突的是,如果配置了shell类型的任务,则会报错

1参数格式不正确 - /d

比如在tasks.json中配置如下任务:

 1{
 2	"version": "2.0.0",
 3	"tasks": [
 4		{
 5			"label": "echo",
 6			"type": "shell",
 7			"command": "echo Hello"
 8		}
 9	]
10}

VSCode实际执行的指令为:C:\Windows\System32\cmd.exe '/K chcp 65001>nul /d /c echo Hello'

在这里插入图片描述 上述cmd命令参数含义如下: 在这里插入图片描述

此时需要关闭前面配置的/K参数。在使用Makefile Tools插件编译C/C++项目时,也需要关闭/K参数。

这样做还是显得比较麻烦,有时需要打开,有时需要关闭,出现冲突时更是麻烦。所以最好的办法是设置launch.json中的配置,笔者发现,codelldb提供了一个postRunCommands配置,可以在启动或者附加调试器后,运行程序前执行配置中的调试指令。 我们只需要在其中执行一次Windows的API:SetConsoleOutputCP(65001),即可正常显示控制台输出的UTF-8字符,参见笔者提的 issue

笔者附上完整的 launch.json

 1{
 2  // 使用 IntelliSense 了解相关属性。
 3  // 悬停以查看现有属性的描述。
 4  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
 5  "version": "0.2.0",
 6  "configurations": [
 7    {
 8      "type": "lldb",
 9      "request": "launch",
10      "name": "Debug",
11      "program": "${workspaceFolder}/build/debug/app.exe",
12      "args": [],
13      "cwd": "${workspaceFolder}",
14      "windows": {
15        "postRunCommands": [
16          "process interrupt",
17          "p (int) SetConsoleOutputCP(65001)",
18          "process continue"
19        ]
20      }
21    }
22  ]
23}

笔者测试的效果:

在这里插入图片描述

如果对你有帮助,欢迎点赞,收藏!