根本原因是终端环境变量(如lang、pythonioencoding)未设为utf-8,导致python等进程输出的utf-8字节被gbk等编码错误解码;需在shell配置文件(如~/.bashrc)中导出lang和pythonioencoding,并重启终端验证。

终端输出乱码是环境变量没对齐
VSCode终端里print("中文")或echo "测试"显示问号、方块或一堆乱码,根本原因不是VSCode本身的问题,而是终端进程启动时继承的环境变量(尤其是LANG和PYTHONIOENCODING)没设成UTF-8。Windows上默认用GBK,Linux/macOS若未显式设置,也可能 fallback 到C locale,导致Python、Node.js等运行时用ASCII解码中文输出。
-
LANG必须设为zh_CN.UTF-8(Linux/macOS)或en-US.UTF-8(Windows WSL)——注意不是zh_CN.GBK或空值 - Windows原生CMD/PowerShell终端不支持UTF-8作为默认编码,建议改用WSL或在VSCode设置里启用
terminal.integrated.defaultProfile.linux指向bash - Python脚本输出乱码时,仅改
LANG还不够,必须额外加PYTHONIOENCODING=utf-8,否则sys.stdout.encoding仍可能是cp936
改settings.json不如改shell配置文件
很多人在VSCode的settings.json里加"terminal.integrated.env.linux"试图覆盖环境变量,但实际效果不稳定——因为VSCode终端启动时,会先读取用户shell的初始化文件(如~/.bashrc或~/.zshrc),再叠加settings.json里的env。如果shell里已经设置了LANG=C,后面再覆盖就晚了。
- 打开
~/.bashrc(或对应shell配置),末尾添加:export LANG=zh_CN.UTF-8<br>export PYTHONIOENCODING=utf-8
- 执行
source ~/.bashrc重载,再重启VSCode终端(不是新建tab,是彻底关掉再开) - 验证是否生效:在终端输入
echo $LANG和python3 -c "import sys; print(sys.stdout.encoding)",两个输出都应为utf-8
字体不支持中文只是“雪上加霜”
即使环境变量全对,终端字体若不含CJK字形,中文仍会显示为空白或方框。这不是编码问题,而是渲染层缺失。VSCode不会自动 fallback 字体,必须手动指定一个含中文字体的组合。
- 在VSCode设置中搜索
terminal.integrated.fontFamily,填入类似"Fira Code", "Microsoft YaHei", "SimSun", "monospace"——逗号分隔,优先用前项,失败则fallback - 避免只写
SimSun:它在macOS/Linux上不存在;也别写Consolas这种纯西文字体 - Windows用户若用WSL,字体设置要针对WSL终端生效,而非Windows CMD;可临时在WSL里运行
locale -a | grep utf8确认系统有UTF-8 locale可用
远程开发时乱码更隐蔽
通过SSH连接远程服务器时,VSCode终端的环境变量来自远端shell,本地settings.json完全无效。此时LANG很可能被远端/etc/default/locale或~/.profile强制设为C或POSIX。
- 登录远端后先运行
locale,看LC_CTYPE和LANG是否为en_US.UTF-8之类 - 若无权限改系统级配置,可在远端
~/.bashrc里加export LANG=en_US.UTF-8(注意:中文界面非必需,UTF-8编码才关键) - 某些老旧Linux发行版(如CentOS 7)默认没生成UTF-8 locale,需先运行
sudo localedef -c -i en_US -f UTF-8 en_US.UTF-8
~/.bashrc开始,一层层继承正确的LANG和PYTHONIOENCODING,而不是靠VSCode临时注入。











