终端乱码主因是 locale 未正确继承,需按环境链排查:系统 locale → vscode 启动方式 → shell 配置 → python 编码推断 → 字体支持;macos/linux 须配 terminal.integrated.env.*,windows 用 chcp 65001 或 pythonioencoding。

终端启动时就乱码,locale 显示 LANG=C 或空值
这是最常见根源:VSCode 终端没继承系统正确的 locale 设置,尤其在 macOS 或 Linux 上用 zsh/bash 时容易发生。不是字体问题,也不是 VSCode 设置里改“终端字体”能解决的。
实操建议:
- 先在系统终端(非 VSCode)里运行
locale,确认输出中LANG和LC_ALL是类似zh_CN.UTF-8或en_US.UTF-8的值 - 如果 VSCode 终端里
locale输出是LANG=C,说明它没读取你的 shell 配置文件(比如~/.zshrc) - 打开 VSCode 设置(
Cmd+,/Ctrl+,),搜terminal.integrated.env,点击“在 settings.json 中编辑”,添加对应平台环境变量:
"terminal.integrated.env.linux": { "LANG": "zh_CN.UTF-8" },
"terminal.integrated.env.osx": { "LANG": "zh_CN.UTF-8" }
注意:Windows 用户不用设这个,乱码通常来自 chcp 编码不匹配,见下一条
Windows 下 PowerShell 或 CMD 中文显示为方块或问号
本质是终端代码页(code page)和实际输出编码不一致。PowerShell 默认用 UTF-16,但很多脚本/工具按 UTF-8 输出,而 Windows 终端默认 code page 是 936(GBK)。
实操建议:
- 进 VSCode 终端后手动执行
chcp 65001(切换到 UTF-8),立刻生效,但每次新开终端都要重输 - 一劳永逸:在 PowerShell 配置文件(
$PROFILE)末尾加一行:chcp 65001 > $null - 确保 VSCode 终端默认 shell 是 PowerShell(不是旧版 CMD),并在设置里确认:
terminal.integrated.defaultProfile.windows设为powershell - 如果用 Git Bash,检查其安装时是否勾选了 “Use Windows' default console code page”,没勾选才支持 UTF-8
print("中文") 在 Python 脚本里输出乱码,但 echo "中文" 正常
这是 Python 自身编码感知问题,和终端设置无关。Python 启动时会根据环境变量推断 stdout 编码,若 LANG 错误或缺失,可能 fallback 到 cp1252(Windows)或 ASCII(Linux/macOS),导致写入失败或替换为
实操建议:
- 不要依赖
sys.stdout.encoding,直接强制指定:在脚本开头加import sys; sys.stdout.reconfigure(encoding='utf-8')(Python 3.7+) - 更稳妥的做法:所有涉及中文输出的 print,显式用
print("中文", encoding='utf-8')不行——print()没有 encoding 参数;正确做法是sys.stdout.buffer.write("中文".encode('utf-8')),但太重;推荐统一用print("中文")+ 确保环境LANG正确(见第一条) - 如果跑在 Windows + Python 3.6 及以下,必须设环境变量
PYTHONIOENCODING=utf-8,否则print()一定乱码
改完配置还是乱码?重点查这三处
很多人反复改 VSCode 设置、字体、locale,却漏掉真正卡点的地方:
- VSCode 是否以“从桌面图标启动”?macOS/Linux 下如果用命令行
code .启动,它会继承当前终端的环境变量;但从 Dock 或应用菜单启动,会走干净的 login shell,不加载.zshrc—— 这时必须靠terminal.integrated.env.*补环境变量 - 终端字体本身不支持中文(比如
Menlo、Consolas),即使编码对,也会显示方块。在 VSCode 设置里搜terminal font,换成"Fira Code", "Microsoft YaHei", "Monaco"这类混合字体栈 - 某些插件(如 Remote-SSH)会覆盖终端环境。连远程机器时,乱码大概率是远端
locale未配置,得在远程服务器上运行sudo locale-gen zh_CN.UTF-8 && sudo update-locale
乱码问题从来不是单点故障,而是环境链断裂:系统 locale → VSCode 启动方式 → 终端 shell 配置 → Python 运行时推断 → 字体渲染支持。少一环,就回到问号和方块。











