vscode终端中文乱码主因是终端子进程(如python、powershell)输出gbk字节流,而vscode用utf-8解码导致错位;需先运行chcp确认代码页为936,再配置"terminal.integrated.profiles.windows"自动执行chcp 65001、设置"terminal.integrated.env.windows": {"pythonioencoding": "utf8"},powershell用户还需在$profile中添加[console]::outputencoding = [system.text.encoding]::utf8,并指定支持中文的等宽字体如"cascadia code"。

VSCode终端中文显示乱码,不是文件编码错了,也不是Python写法有问题,而是终端子进程(比如python、powershell.exe)输出的字节流,和VSCode用来解码它的规则不一致——两边一个用GBK(CP936),一个用UTF-8,对不上就必然出???、浣犲ソ或方块。
怎么确认是终端代码页没切到UTF-8
在VSCode集成终端里直接运行:chcp。如果输出是活动代码页: 936,说明终端正在用GBK;只有输出65001才算UTF-8生效。别跳过这步——很多人改了一堆配置却没验证,结果白忙。
-
chcp 65001临时执行后中文立刻正常 → 问题锁定在启动流程没自动执行 -
chcp返回65001但print("中文")仍是???→ Python进程没读到UTF-8环境,得看PYTHONIOENCODING -
chcp返回65001但echo "中文"也乱 → 字体或PowerShell自身$OutputEncoding没设对
PowerShell终端必须加-NoExit -Command才能永久生效
只在settings.json里配"terminal.integrated.profiles.windows",但漏掉-NoExit,终端一启动就退出,chcp 65001根本没机会执行。正确写法是:
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"args": ["-NoExit", "-Command", "chcp 65001 > $null"]
}
}
-
-NoExit必须有,否则PowerShell启动完立即关闭 -
> $null不是必须,但能隐藏Active code page: 65001提示,视觉干净 - 改完必须重启VSCode,只关终端再开新tab没用——旧shell进程环境已固化
PYTHONIOENCODING=utf8和[Console]::OutputEncoding要双管齐下
即使chcp返回65001,Python仍可能沿用系统默认的cp936,因为sys.stdout.encoding是在进程启动时读取环境决定的。光靠终端切页不够,还得告诉Python:“你输出/输入一律用UTF-8”。
- 在
settings.json中加:"terminal.integrated.env.windows": {"PYTHONIOENCODING": "utf8"} - PowerShell用户额外在
$PROFILE末尾加:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - 别设
terminal.integrated.encoding——这个字段已弃用,设了也不起作用 - 验证方式:
python -c "import sys; print(sys.stdout.encoding)",必须输出utf-8
字体不支持中文会显示方块,和编码无关
哪怕chcp、PYTHONIOENCODING、[Console]::OutputEncoding全对,终端里还是口口口,那就是字体问题。Consolas、Fira Code这些主流等宽字体默认不含CJK字形,渲染时fallback失败就出方块。
- Windows用户:右键终端 → 属性 → 字体 → 手动选
Consolas或Cascadia Code(别用SimSun,它不是等宽字体) - VSCode设置里填
terminal.integrated.fontFamily,例如:"Cascadia Code", "Microsoft YaHei" - 改完必须新开终端,旧终端不会刷新字体渲染引擎
- 用
echo "测试中文"验证,不是靠print()——它绕过Python编码逻辑,直击字体层
最常被忽略的是:PowerShell 7+默认禁用脚本执行策略,-Command里的chcp可能被跳过;还有Git Bash里LANG环境变量为空,也会导致中文路径变\344\270\255\346\226\207。这些问题都藏在“终端启动那一瞬间”,不在代码里,也不在Python源文件里。











