VSCode控制台乱码
乱码原因
乱码本质就是编码集合不一样,代码中一般会使用UTF-8,而操作系统的控制台 (cmd 或者 powershell)使用的是GBK。
集成开发环境编码集:

控制台开发环境编码集:
可使用 chcp 命令查看控制台代码页查看控制台的活动代码页

用GBK的编码集去解释UTF-8的字符就会出现乱码的问题
根本原因
网上有很多教程,关于如何解决乱码问题,但是很多都缺少解释,没有说清楚设置的原因。有时候会出现设置了不生效,或者vscode中输出中文正常,但是在操作系统中拉起的控制台乱码的情况。那么原因是什么呢?首先要先了解下面的这三个特点:
1、Windows 系统存在两个核心控制台程序:一是传统原始的 CMD(命令提示符),二是功能更完善的 PowerShell。二者的编码配置、运行环境完全独立,修改其中一个的编码规则,不会对另一个产生任何影响。
2、VS Code 的终端并非独立控制台,而是可由用户手动配置调用对象 —— 在 VS Code 终端设置中,能自由选择调用系统的 CMD 或 PowerShell,其编码环境完全跟随所调用的控制台。
3、双击 EXE 可执行程序弹出的控制台,与通过 Win+R 输入 cmd 打开的控制台环境不同。前者是无任何额外参数的 “纯净默认 CMD”,不会继承用户对 CMD 的自定义配置;后者则会加载用户此前修改的编码、环境变量等设置。
1、 VS Code 输出仍乱码,且通过 CMD 和 PowerShell 分别运行 EXE 时,结果不一致 —— 可能 CMD 正常、PowerShell 乱码,也可能相反。
原因:修改的控制台,与 VS Code 实际调用的控制台不匹配。比如修改了 PowerShell 编码,但 VS Code 终端配置的是 CMD,自然无法解决 VS Code 内的乱码问题。
2、修改后 VS Code 输出不再乱码,但直接用 CMD 或 PowerShell 运行 EXE 时,其中一个会乱码。
原因:仅修改了 VS Code 所调用的那个控制台编码,未同步修改另一个控制台的编码。比如 VS Code 调用的 CMD 已改为 UTF-8,但系统原生 PowerShell 仍为默认编码,直接用 PowerShell 运行就会乱码。
3、修改后 VS Code 输出正常,CMD 和 PowerShell 运行 EXE 也无乱码,但双击 EXE 弹出的控制台依旧乱码。
原因:双击 EXE 触发的是 “纯净默认 CMD”,该环境不会继承用户对 CMD 的自定义配置。即便通过注册表等方式修改了 Win+R 打开的 CMD 编码,双击 EXE 拉起的 CMD 仍会使用系统原始默认编码,最终导致乱码。
解决方案
按照上面的解释,可以分为四个层次:临时设置、工程项目级设置、控制台级设置、系统级设置(不推荐)。
方案1:临时设置(推荐)
在代码的main函数刚启动的时候,添加如下代码,则会自动将控制台设置为utf-8的代码页。
system("chcp 65001 > nul");
优点:修改方便,无需修改系统,并且双击exe文件也可以使用
缺点:对代码有入侵,并且受语言限制
方案2:项目级设置
通过配置 .vscode/settings.json 文件,将 chcp 65001作为启动参数传递给控制台,这样就可以做到项目级别的设置,代码如下:
{
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"icon": "terminal-powershell",
"args": [
"-NoExit",
"chcp 65001"
]
},
"Command Prompt": {
"path": [
"${env:windir}\\System32\\cmd.exe"
],
"args": [
"/k",
"chcp 65001"
],
"icon": "terminal-cmd"
}
},
"terminal.integrated.defaultProfile.windows": "PowerShell", // 用来配置使用的终端
}
优点:修改不算麻烦,并且不受语言限制
缺点:仅解决vscode内置控制台乱码,使用cmd/powershell运行编译好的exe文件,或者双击exe文件执行仍乱码
方案3:控制台设置
这个方案会比较麻烦,需要修改注册表以及给powershell提供策略,但是兼容性还算可以。并且不需要配置vscode,以后的所有的vscode工程项目都适用
powershell设置
原理是通过配置文件,自动执行切换的动作
- 以管理员身份打开powershell (win + R 输入 powershell ,按住 ctrl + shift + 回车)
- 输入 New-Item $PROFILE -ItemType File -Force 创建配置文件
- 输入 notepad $PROFILE 编辑刚刚创建的配置文件
- 在弹出的文本框中粘贴下面的代码并保存
$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding chcp 65001 | Out-Null - 输入 Set-ExecutionPolicy RemoteSigned 修改执行策略,放开权限
- 重新打开powershell 使用chcp验证是否为 65001
cmd设置
原理是通过注册表,在运行前自动执行chcp 65001 的动作
- 打开注册表 (win + R 输入 Regedit)
- 导航到路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
- 在右侧窗格右键,选择"新建"→"字符串值",命名为 AutoRun
- 双击 AutoRun,将数值数据设置为 chcp 65001 > nul
- 关闭注册表编辑器,重启 cmd 控制台即可生效
优点:不需要在vscode中配置,vscode中不管使用cmd还是powershell都正常,外部通过cmd/powershell执行exe也正常
缺点:双击exe运行程序弹出的代码会乱码
方案4:直接修改电脑的编码集(不推荐)
通过这种方式,兼容性很差,会导致很多软件乱码,不推荐使用,这里只是提供一种思路

优点:彻底解决乱码问题
缺点:会干扰很多中文软件,导致乱码,也许重新安装可以解决,也可能无法解决

浙公网安备 33010602011771号