必须在 launch.json 的 configuration 内部添加 "env": {"pythonioencoding": "utf8"} 才能使 debug console 正确显示中文,因 debug console 不读 terminal.integrated.env.windows 或 settings.json,且 windows 下仅识别小写 utf8;console 字段需设为 integratedterminal 或 externalterminal,不可用 internalconsole 或缺失;output 面板走独立通道,不受 launch.json 影响,需系统级启用 utf-8 支持方可根治。

launch.json 里加 env 字段才能影响 Debug Console
Debug Console 不走集成终端那一套,也不读 terminal.integrated.env.windows,它由调试器进程直连 Node.js 层渲染,Windows 上默认完全无视 UTF-8。所以即使你在 settings.json 里配好了 PYTHONIOENCODING,Debug Console 里 print("中文") 还是显示 ? 或空格——这不是配置漏了,是根本没走同一条链路。
必须在项目根目录的 .vscode/launch.json 中,给当前 launch 配置显式加 env:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"module": "pytest",
"console": "integratedTerminal",
"env": {
"PYTHONIOENCODING": "utf8"
},
"justMyCode": true
}
]
}
-
env必须写在具体 configuration 对象内部,不能放在外层或configurations数组外面 - 值必须是小写
utf8,不是UTF-8、utf-8或UTF8,Windows 下只有这个拼写被识别 - 如果用了 Code Runner 插件跑调试,它不读
launch.json,得单独改它的执行命令,比如:"code-runner.executorMap": {"python": "chcp 65001 && python -u"}
console 字段选错会导致 env 完全不生效
如果你把 "console": "externalTerminal" 或 "console": "integratedTerminal" 写对了,env 才会传给 Python 进程;但若设成 "console": "internalConsole"(已弃用),或者压根没写 console 字段,VSCode 会 fallback 到旧版调试控制台,此时 env 被忽略,乱码照旧。
常见组合与效果:
-
"console": "integratedTerminal":走集成终端,env生效,且能复用你配好的terminal.integrated.profiles.windows -
"console": "externalTerminal":弹出独立 CMD/PowerShell 窗口,env也生效,但窗口自身代码页仍需额外处理(比如靠chcp 65001启动) -
"console": "none"或缺失该字段:回退到 internalConsole,env失效,Debug Console 乱码无法缓解
launch.json 配置后仍乱码?优先检查 Python 版本和调试器
某些老版本 ptvsd(python-debugger 扩展依赖的底层)或自定义 debug adapter 会绕过 env 注入逻辑,尤其在 Windows 上。这时候 print() 输出乱码,同时 Debug Console 里还可能伴随一行警告日志:Warning: Failed to set encoding on stdout/stderr。
验证方式:
- 在 Debug Console 输入
import sys; sys.stdout.encoding,如果返回'cp936',说明PYTHONIOENCODING没生效 - 升级 Python 到 3.8+,并确保使用官方
ms-python.python扩展(非第三方 debug adapter) - 如果用的是 C/C++ 项目,
launch.json中的type是cppvsdbg或gdb,那env字段要写在对应配置下,且只影响程序启动环境,不影响调试器自身输出
别忘了 Output 面板也是独立通道
Output 面板(比如 Python Test Log、CMake Tools 输出)不读 launch.json,也不继承 terminal.* 设置,它由 VSCode 主进程直接捕获子进程 stdout/stderr 字节流,底层依赖 Node.js 的编码感知能力。Windows 上 Node 默认禁用 UTF-8 模式,所以即使 launch.json 和终端都配对了,Output 面板里仍可能出现问号。
目前无通用配置项可修复,临时方案只有两个:
- 在对应扩展的文档里查是否支持自定义 env(如 CMake Tools 提供
cmake.environment设置) - 彻底统一系统级编码:启用 Windows “Beta: Use Unicode UTF-8 for worldwide language support”,重启系统——这是唯一能让 Output 面板、终端、Debug Console 全部对齐的根治法,但会影响部分老旧 Win32 应用
真正容易被忽略的点是:launch.json 只管调试启动那一刻的环境变量,它不接管后续所有子进程的编码行为;而 Output 面板甚至不经过调试器进程,直接从主进程 fork 出来捕获输出——这两条路径,从来就不是一回事。











