vscode终端显示???是因windows终端用gbk解码而python以utf-8输出,需同步配置pythonioencoding=utf8、chcp 65001、支持中文的字体及launch.json中的env字段,缺一不可。

VSCode终端中文显示为???,不是文件编码错了,而是终端代码页和Python输出流没对齐——改files.encoding没用,必须动PYTHONIOENCODING和chcp 65001。
为什么print("中文")在终端里只显示???
Windows终端(CMD/PowerShell)默认用GBK(CP936)解码字节流,而Python在VSCode里默认以UTF-8输出中文。当终端拿GBK去硬解UTF-8字节时,三个字节全无法映射,就统一替换成?。这不是字符丢了,是“词典版本不对”。验证方法:在终端运行python -c "import sys; print(sys.stdout.encoding)",如果输出cp936,就坐实了这个问题。
必须配置PYTHONIOENCODING=utf8环境变量
仅靠chcp 65001不够:PowerShell启动后切了代码页,但Python解释器仍可能读取系统旧locale,把sys.stdout.encoding设成cp936。强制它用UTF-8输出,得靠环境变量:
- 在
settings.json中添加"terminal.integrated.env.windows": { "PYTHONIOENCODING": "utf8" }(注意是小写utf8,不是UTF-8) - 改完必须关闭所有已打开的集成终端,再新建一个才生效
- Debug Console不继承该设置,需在
.vscode/launch.json的对应launch配置里加"env": { "PYTHONIOENCODING": "utf8" }
PowerShell/CMD启动时自动执行chcp 65001
chcp 65001不能手动敲,每次新开终端都要重来。必须让shell自己启动时就切:
- PowerShell推荐配置:
"args": ["-NoExit", "-Command", "$env:PYTHONIOENCODING='utf8'; chcp 65001 > $null"](-NoExit防止窗口闪退) - CMD配置:
"args": ["/c", "chcp 65001 > nul && cmd.exe"](用/c而非/K更稳定) - 已有
terminal.integrated.profiles.windows字段,直接合并对象,别重复声明导致JSON解析失败 - 确认
terminal.integrated.defaultProfile.windows值设为"PowerShell"或"cmd"
字体和Debug Console是两个独立坑
即使编码全对了,终端字体不支持中文,还是显示口口口;Debug Console又走另一套启动逻辑,容易漏配:
- 在设置里搜
terminal.integrated.fontFamily,设为"Consolas, 'Microsoft YaHei', 'SimSun'"这类含中文字体的列表 - Debug Console里的
???大概率是因为launch.json没加env字段,或者用了老版ptvsd且启动参数含--log-to-stderr,会干扰编码识别 -
terminal.integrated.encoding已被弃用,写了也无效,别浪费时间
真正卡住人的从来不是单点配置,而是PYTHONIOENCODING、chcp、字体、launch.json这四者缺一不可——少一个,???就还在那儿等着你。











