VSCode终端乱码主因是Windows终端代码页(CP936)与VSCode UTF-8解码不一致,需同时配置"terminal.integrated.env.windows": {"PYTHONIOENCODING": "utf8"}和PowerShell启动时执行chcp 65001,并重启终端验证。

VSCode终端执行命令出现乱码,基本可以断定是 Windows 终端代码页(CP)和 VSCode 解码逻辑不一致导致的——不是文件编码错了,也不是字体完全没选对,而是字节流在“写出来”和“读进去”之间被用不同编码解释了。核心解法就两条:让子进程(如 python、git、node)按 UTF-8 输出,同时让终端环境(cmd 或 powershell)按 UTF-8 解码。
先确认是不是 CP936(GBK)惹的祸
在 VSCode 集成终端里直接运行:chcp。如果输出是“活动代码页: 936”,问题根源就坐实了:Windows 控制台默认用 GBK 编码输出,而 VSCode 内部统一按 UTF-8 解析字节流,中间断层。
- 临时验证:输入
chcp 65001回车,再执行一遍出问题的命令(比如python -c "print('你好')"),立刻正常 → 就是它 -
chcp在 PowerShell 7+ 默认不可用,需先执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser启用脚本权限 - 别只看编辑器右下角显示“UTF-8”——那只是文件保存编码,和终端 stdout 无关
settings.json 必加的两项环境变量
仅靠 terminal.integrated.defaultEncoding 没用,这个配置项在新版 VSCode 中已被弃用。真正起效的是通过环境变量控制子进程行为:
- 必须加
"terminal.integrated.env.windows": {"PYTHONIOENCODING": "utf8", "CHCP": "65001"} -
PYTHONIOENCODING强制 Python 的sys.stdout和sys.stderr使用 UTF-8 编码,绕过系统代码页探测逻辑 -
CHCP环境变量会让cmd.exe启动时自动切到 UTF-8,对 PowerShell 也有辅助作用 - 大小写敏感:
utf8必须全小写,UTF-8或utf-8在 Windows 下不生效
PowerShell 用户额外要设 OutputEncoding
PowerShell 5.1 默认用 [System.Text.Encoding]::Default(即 CP936)输出,即使 chcp 65001 成功,$OutputEncoding 和 [Console]::OutputEncoding 仍可能是 GBK。
- 临时修复:在终端里手动执行
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - 永久生效:编辑 PowerShell 配置文件(
$PROFILE),末尾添加这一行并保存:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - VSCode 启动参数里也建议补上:
"terminal.integrated.shellArgs.windows": ["-NoExit", "-Command", "chcp 65001 > $null"],避免$PROFILE加载前就输出乱码
字体和系统级 UTF-8 是最后一道防线
即使所有编码设置都对了,终端里还是一堆方块,大概率是字体链没兜住中文。
- VSCode 设置中搜
terminal.integrated.fontFamily,填入带中文字体的等宽链,例如:"Cascadia Code", "Microsoft YaHei", monospace - Windows 用户必须进终端右键 → 属性 → 字体,手动选
Consolas或Cascadia Code(仅靠 VSCode 设置不够) - 改完后必须关掉当前终端,再按
Ctrl + Shift + `新开一个——旧终端不会刷新字体 - 系统级开启 UTF-8(控制面板 → 区域 → 管理 → 更改系统区域设置 → 勾选“Beta 版:使用 Unicode UTF-8 提供全球语言支持”)能一劳永逸,但需重启电脑
最常被忽略的点是:Debug Console / Output 面板不走终端进程,也不读 terminal.* 配置,它依赖 VSCode 主进程与调试器之间的通信协议。即使终端全好了,这里还可能糊,得单独在项目根目录的 .vscode/launch.json 里给 launch 配置加 "env": {"PYTHONIOENCODING": "utf8"}。


















