根本原因是python stdout编码与终端解码不一致:windows终端默认gbk(936),而python按utf-8输出,需同步配置terminal.integrated.profiles.windows设chcp 65001、terminal.integrated.env.windows设pythonioencoding为utf8,并配置支持中文的等宽字体链,修改后必须关闭全部终端并新建。

VSCode 里 print("中文") 在终端显示为 ?? 或方块,不是文件编码错了,也不是字体没选对——根本原因是 Python 进程的 stdout 编码和终端解码不一致。Windows 下默认终端用 GBK(代码页 936),而 Python 3 默认按 UTF-8 输出,中间没对齐,必然乱。
确认当前终端和 Python 的实际编码
先别改配置,打开一个新终端(Ctrl + Shift + `),执行两行命令:
-
chcp—— 看输出是不是活动代码页: 936(GBK)还是65001(UTF-8) -
python -c "import sys; print(sys.stdout.encoding)"—— 看 Python 自己认为 stdout 是什么编码
如果 chcp 显示 936,但 Python 输出 utf-8,那就是典型错位:终端用 GBK 去解 UTF-8 字节流,结果就是问号或方块。
PowerShell 终端必须加 chcp 65001 启动参数
VSCode 默认启动 PowerShell 时不会自动切 UTF-8,靠手动输 chcp 65001 只能临时生效。必须在 settings.json 里固化:
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"args": ["-NoExit", "-Command", "chcp 65001 > $null"]
}
}
注意点:
- 改完后要关闭所有已打开的终端标签页,再新建一个才生效
- 别用
cmd替代——它对 UTF-8 支持更差,即使加了chcp也容易在子进程里退回到 GBK - 验证方式:
[Console]::OutputEncoding应返回System.Text.UTF8Encoding
Python 进程必须知道它该用 UTF-8 输出
即使终端设成 UTF-8,Python 启动时仍可能从系统 locale 继承错误的 stdout 编码。最稳的方式是通过环境变量强制:
"terminal.integrated.env.windows": {
"PYTHONIOENCODING": "utf8"
}
关键细节:
- 值必须是小写
utf8,写成UTF-8或utf-8在 Windows 上无效 - 这个设置只影响终端里直接运行的 Python,不影响 Debug Console —— 调试器需单独在
launch.json的env字段里加同一项 - 如果用了 Code Runner 插件,它的执行命令也要显式加
set PYTHONIOENCODING=utf8 &&前缀
字体不是万能的,但缺它一定不行
编码全对了还显示方块?那大概率是字体链没兜住中文。VSCode 设置里的 terminal.integrated.fontFamily 必须包含至少一个支持中文的等宽字体,例如:
"Cascadia Code", "Microsoft YaHei", monospace
但仅这样不够:
- Windows 用户必须右键终端 →「属性」→「字体」选项卡 → 手动选
Cascadia Code或Consolas(不能留空或选 SimSun) - SimSun(宋体)不是等宽字体,会导致光标错位、对齐混乱,绝对不要设为终端主力字体
- 改完字体后同样要关掉旧终端,新开一个才刷新渲染
真正容易被忽略的是:终端编码、Python 输出编码、字体三者必须同时对齐,缺一不可;而且任何一项改完都必须新开终端——重载标签页或 Ctrl+Shift+P → “Terminal: Kill the Active Terminal” 都不等于“重启进程”,旧终端里的 chcp 和环境变量不会更新。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











