根本原因是windows终端默认gbk编码与工具链utf-8输出冲突,需在terminal.integrated.profiles.windows中为powershell配置chcp 65001启动参数以强制utf-8代码页,确保子进程字节流被正确解析,同时指定中文字体并重启终端验证。

VSCode终端输出中文乱码,不是文件编码问题,而是终端子进程与conhost之间的编码协商失败——直接改terminal.integrated.profiles.windows加chcp 65001最有效。
为什么chcp 65001必须加在终端启动参数里
Windows旧版终端(cmd.exe、PowerShell 5.1)默认用cp936(即GBK)写入stdout字节流,而VSCode集成终端默认以UTF-8解析这些字节。两者不匹配,就出现“你好”变成“・”这类乱码。chcp 65001命令在shell启动时强制切换当前会话代码页为UTF-8,让子进程(如node、python)输出的字节能被正确解读。
常见错误现象:
- 改了
files.encoding但终端输出还是乱码 - 在外部PowerShell窗口里
chcp 65001后运行正常,但在VSCode终端里仍乱码 - 终端左下角显示的是
PowerShell而非powershell 7,说明没生效
实操建议:
- 不要只改
terminal.integrated.defaultProfile.windows,必须同步配置terminal.integrated.profiles.windows中对应shell的args - PowerShell 5.1用
["-NoExit", "-Command", "chcp 65001 | Out-Null"];PowerShell 7+可省略chcp,但建议保留以兼容旧脚本 - cmd场景下用
["/K", "chcp 65001"],/K保证命令执行后保持终端打开
terminal.integrated.fontFamily影响的是显示,不是解码
即使终端编码完全正确,若字体不支持中文,依然显示方块或空白。这不是乱码,是渲染缺失。VSCode不会自动 fallback 到系统中文字体,必须显式指定。
实操建议:
- 在
settings.json中添加:"terminal.integrated.fontFamily": "'Cascadia Code', 'Microsoft YaHei', 'SimSun', monospace" - 引号必须成对,中文字体名要用单引号包裹,多个字体用英文逗号分隔
- 避免只写
"Microsoft YaHei"——缺少备选字体时,遇到emoji或CJK扩展区字符会回退到方块 - Mac/Linux用户注意:
Cascadia Code需手动安装,否则直接跳过
PowerShell 7比PowerShell 5.1更可靠,但别依赖$OutputEncoding
PowerShell 7默认UTF-8,且$OutputEncoding默认就是[System.Text.UTF8Encoding]::new()。但VSCode终端集成层有时会覆盖该变量,尤其在调用外部二进制(如git、curl)时。
实操建议:
- 优先用PowerShell 7:
"terminal.integrated.defaultProfile.windows": "PowerShell 7" - 若必须用PowerShell 5.1,除了
chcp 65001,还需在args中追加:$OutputEncoding = [System.Text.UTF8Encoding]::new() - 不要在用户profile.ps1里设
$OutputEncoding——VSCode终端可能不加载profile,导致失效 - 验证是否生效:在终端运行
node -e "console.log('中文')"和echo '中文',两者都正常才算闭环
最容易被忽略的一点:终端编码设置只影响新打开的终端,已存在的终端窗口不会自动重载配置。每次改完settings.json,务必按Ctrl+Shift+`关掉再开一个,别指望热重载。











