终端乱码主因是外部终端未启用UTF-8编码、字体不支持中文及程序环境变量缺失;需分别配置终端启动参数(如chcp 65001)、指定中文字体(如Cascadia Code PL)、清除BOM并设置PYTHONIOENCODING。

终端乱码不是 VSCode 的问题,是外部终端自己没用 UTF-8
VSCode 点击「在外部终端中打开」(比如右键文件 → Open in Terminal 或使用 code --new-terminal)后中文变 ??? 或方块,90% 情况下 VSCode 没做错任何事——它只是把外部终端(cmd.exe、powershell.exe、wt.exe 甚至 gnome-terminal)吐出来的字节原样展示。而这些终端默认根本没启用 UTF-8。
-
cmd.exe默认代码页是936(GBK),chcp返回的不是65001就说明它还在用 GBK 输出 -
powershell.exe默认用系统区域编码输出,[Console]::OutputEncoding不是UTF8Encoding就等于提前把中文喂成了乱码字节 - Windows Terminal(
wt.exe)虽默认支持 UTF-8,但若其配置里指定了旧版cmdprofile 且没加chcp 65001,照样乱
怎么让外部终端真正用 UTF-8 启动
关键不是改 VSCode 设置,而是确保你点开的那个终端进程一启动就处于 UTF-8 环境。这需要分终端类型处理:
- 对
cmd.exe:必须在启动参数里强制执行chcp 65001,例如在 Windows Terminal 的settings.json中为 cmd profile 加:"commandline": "cmd.exe /k chcp 65001" - 对
powershell.exe:最稳方式是改$PROFILE,加一行:$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8;别只靠 VSCode 的terminal.integrated.defaultEncoding,它管不了 PowerShell 自己的输出流 - 对
wt.exe(Windows Terminal):检查其profiles.json里每个 shell 的commandline是否含chcp 65001或已设"utf8": true;macOS/Linux 用户同理,确认gnome-terminal或iTerm2的默认配置里启用了 UTF-8
字体链没配对,UTF-8 也白搭
编码对了,终端还是显示方块?那是字体不认中文。外部终端(尤其 cmd 和旧版 PowerShell)不走 VSCode 字体设置,它用的是系统级终端字体——比如 Windows 的「控制面板 → 字体」或 Windows Terminal 的 font.face 配置。
- Windows 下,
cmd.exe只能选等宽位图字体(如Lucida Console)或 TrueType 字体(如Consolas、Cascadia Code),但Consolas本身不含中文字形,必须手动指定支持中文的等宽字体,例如:Cascadia Code PL或Microsoft YaHei Mono - 在 Windows Terminal 的
settings.json中,为对应 profile 显式设:"font": { "face": "Cascadia Code PL" };别指望只改 VSCode 的terminal.integrated.fontFamily能影响外部终端 - macOS/Linux 用户注意:
PingFang SC和Noto Sans CJK SC必须拼写完全准确,少一个空格或大小写错误,终端就 fallback 到无中文的字体
别被「UTF-8 with BOM」和系统区域设置坑了
即使终端和字体都调好了,某些脚本(尤其是 Python 或 Node.js 子进程)仍可能输出乱码——根源常藏在两个隐蔽位置:
- 文件本身是
UTF-8 with BOM:VSCode 编辑器能识别,但python xxx.py执行时,BOM 可能被当作文本开头字符,导致print("测试")实际输出\ufeff测试,终端渲染异常;右下角点编码 →Save with Encoding→ 选UTF-8(不带 BOM) - Windows「Beta 版:使用 Unicode UTF-8 提供全球语言支持」勾选了:这个系统级开关会干扰
cmd和powershell的传统编码逻辑,导致 VSCode 外部终端行为不稳定;建议取消勾选并重启 - Python 脚本里没设环境变量:
set PYTHONIOENCODING=utf-8(Windows)或export PYTHONIOENCODING=utf-8(macOS/Linux)可强制 Python 标准流用 UTF-8,避免子进程输出错乱
外部终端乱码的本质是三层脱节:终端进程的编码、终端自身的字体、以及它运行的程序的环境变量。三者缺一不可,而且每层都要独立验证——进终端敲 chcp 或 locale,别只信 VSCode 设置界面里写的字。










