根本原因是windows终端默认用gbk(cp936)解码,而python按utf-8输出,导致stdout编码错配;需在settings.json中配置"terminal.integrated.env.windows": {"pythonioencoding": "utf8"}并重启终端,同时code runner等插件需单独适配。

为什么 print("中文") 在终端里显示方块或问号
不是文件保存错了,也不是编辑器右下角没点“UTF-8”——那是编辑器读文件的编码,和 Python 运行时输出无关。真正卡住的是:Windows 终端(PowerShell/CMD)默认用 GBK(代码页 936),而 Python 进程的 sys.stdout.encoding 跟着它走,结果你 print() 的 UTF-8 字节流被当成 GBK 解码,自然崩成乱码。
验证方法很简单:在 VSCode 终端里运行这两条命令:
-
chcp→ 如果输出“活动代码页: 936”,说明终端底层是 GBK -
python -c "import sys; print(sys.stdout.encoding)"→ 如果输出cp936(不是utf-8),就坐实了错配
settings.json 必加的环境变量:PYTHONIOENCODING
这是最轻量、最稳的解法,不依赖 shell 启动脚本,也不碰已弃用的 terminal.integrated.encoding。
在 VSCode 的 settings.json 中加入:
"terminal.integrated.env.windows": {
"PYTHONIOENCODING": "utf8"
}
注意三点:
- 值必须是
utf8(全小写,不能写UTF-8或utf-8,否则无效) - 这个变量强制 Python 所有 I/O(
print、input、重定向等)走 UTF-8 编码路径 - 改完后必须关闭所有已打开的终端(Ctrl + Shift + ` 全关掉),再新建一个才生效
如果用了 Code Runner 插件,还得额外处理
Code Runner 默认绕过 VSCode 的环境变量设置,直接调用 python 命令,所以即使你设了 PYTHONIOENCODING,它也看不到。
解决办法:打开插件配置,找到 code-runner.executorMap,把 Python 条目改成:
"python": "chcp 65001 && python -u $fileName"
或者更稳妥的写法(兼容性更好):
"python": "set PYTHONIOENCODING=utf8 && python -u $fileName"
关键点:
-
-u参数确保 Python 不缓冲输出,避免日志延迟或截断 -
set是 CMD 语法;若你用 PowerShell 作为默认终端,应改用$env:PYTHONIOENCODING='utf8'; python -u $fileName - 别只改
c或cpp的配置,Python 那一项才是重点
已有文件乱码,不能只靠改设置
files.encoding 设置只影响新建文件和保存动作,对已存在的文件完全无效。如果你打开一个旧文件,右下角显示的是 GBK 或 ISO-8859-1,那它大概率就是用那个编码存的。
修复步骤分两步:
- 先点右下角编码名 → 选 Reopen with Encoding →
UTF-8:这只是临时用 UTF-8 解码看看是否显示正常 - 如果显示正常,再点一次右下角 → Save with Encoding →
UTF-8:这才真正把内容以 UTF-8 写回磁盘 - 如果第一步就乱码,说明原文件是 GBK 编码,得先
Reopen with Encoding → GBK,再Save with Encoding → UTF-8
最容易被忽略的是:团队里有人用 Windows 记事本保存过 .py 文件,它默认加 BOM。VSCode 会识别为 UTF-8 with BOM,而 Python 解释器看到 \ufeff 开头可能报 SyntaxError。务必禁用 BOM:"files.saveWithBOM": false。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











