我们在Windows使用VSCode编写C/C++程序时,如果代码中的中文字符串使用的是UTF8编码,且代码内没有设置控制台的输出编码,或者编译时没有指定运行时编码(GCC可以在编译时使用-fexec-charset=GBK
来指定运行时的字符串编码;clang目前只能是utf-8),则在调试或者运行时,VSCode控制台输出的中文字符可能会为乱码。
目前VSCode中微软官方出品的cppdbg
引擎已经是可以正常输出UTF-8字符,不管是使用gdb
还是lldb
。不过cppdbg
引擎使用lldb
调试器时,不是直接调用的LLDB API
,而是使用的lldb-mi
,lldb-mi
项目已经很久没人维护了,基本上处于停滞状态。如果想要使用lldb
调试器,可以使用CodeLLDB
插件,不过该插件是直接使用的Windows的控制台,Windows控制台默认是使用的GBK编码,代码输出UTF8编码的字符串就会出现乱码。
为了一劳永逸地解决VSCode中控制台输出UTF8字符串时乱码的问题,可以在settings.json
中添加如下配置:
"terminal.integrated.profiles.windows": {
"Command Prompt": {
"path": [
"${env:windir}\\Sysnative\\cmd.exe",
"${env:windir}\\System32\\cmd.exe"
],
// CodeLLDB插件,打开此项解决中文输出乱码问题
"args": ["/K", "chcp 65001>nul"],
"icon": "terminal-cmd"
}
}
即在cmd命令行后添加/K chcp 65001>nul
或者/K chcp 65001
,这样VSCode中启动的控制台全部会使用UTF8编码输出。
注意:这样配置后,会有点冲突的是,如果配置了shell
类型的任务,则会报错:
参数格式不正确 - /d
比如在tasks.json
中配置如下任务:
{
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "echo Hello"
}
]
}
VSCode实际执行的指令为:C:\Windows\System32\cmd.exe '/K chcp 65001>nul /d /c echo Hello'
上述cmd命令参数含义如下:
此时需要关闭前面配置的/K
参数。在使用Makefile Tools
插件编译C/C++项目时,也需要关闭/K
参数。