终端显示方块或问号是因编码不匹配:VSCode终端默认UTF-8,而Windows cmd/powershell常继承GBK(936);Python中文输出异常源于sys.stdout.encoding为cp936;Git Bash乱码因LANG/LC_ALL未设为zh_CN.UTF-8;需逐级检查VSCode编码、终端profile、环境变量及shell配置。

终端启动时就显示方块或问号
这是典型的字符编码不匹配,VSCode 终端默认用 UTF-8,但 Windows 的 cmd.exe 或 powershell.exe 启动时可能继承控制台的 GBK(代码页 936)环境,导致中文无法正确解码渲染。
实操建议:
- 在 VSCode 中按
Ctrl+Shift+P打开命令面板,输入并执行Terminal: Select Default Profile,选中PowerShell (x64)或Git Bash(推荐后者,原生 UTF-8 支持更稳) - 若坚持用
cmd,需在终端启动前强制切换代码页:在settings.json中添加配置:"terminal.integrated.profiles.windows": { "Command Prompt": { "path": "cmd.exe", "args": ["/k", "chcp.com 65001 >nul"] } } - 避免直接双击打开
cmd.exe设置“属性→字体→Lucida Console”,这个字体在 VSCode 集成终端里不生效;应改用"terminal.integrated.fontFamily": "Consolas, 'Microsoft YaHei'"
Python print() 输出中文变成 或空格
不是 VSCode 的问题,而是 Python 进程本身没用 UTF-8 编码读取/写入标准流。尤其在 Windows 上,sys.stdout.encoding 常为 cp936,和终端期望的 UTF-8 不一致。
实操建议:
- 临时验证:在 Python 脚本开头加
import sys; print(sys.stdout.encoding),确认是否为utf-8 - 强制重置 stdout 编码(仅调试用):
import io; sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') - 一劳永逸:在 VSCode 的
settings.json中设置 Python 启动参数:"python.defaultInterpreterPath": "./venv/Scripts/python.exe", "python.terminal.launchArgs": ["-X", "utf8"]
(-X utf8强制启用 UTF-8 模式,Python 3.7+ 支持)
Git Bash 终端里 ls 中文文件名显示为 M-oM-^@M-^T
这是 Git Bash 默认使用 UTF-8,但 locale 未设为中文环境,导致终端把 UTF-8 字节流误当作 Latin1 解码。本质是 LANG 和 LC_ALL 环境变量缺失或冲突。
实操建议:
- 在 VSCode 的
settings.json中为 Git Bash 配置环境变量:"terminal.integrated.env.windows": { "LANG": "zh_CN.UTF-8", "LC_ALL": "zh_CN.UTF-8" } - 不要在
~/.bashrc里硬写export LANG=...,VSCode 启动时不会 source 用户 shell 配置(除非启用"terminal.integrated.inheritEnv": true,但有安全风险) - 验证是否生效:在终端运行
locale,输出中所有字段都应含UTF-8,且无POSIX或空值
修改后仍乱码,检查这三处硬编码点
很多用户反复改配置无效,是因为忽略了底层进程链中某一级悄悄覆盖了编码设置。
必须逐项确认:
- VSCode 自身编码:右下角状态栏点击编码标识(如
UTF-8),确保当前文件保存为UTF-8,不是GBK或ISO-8859-1 - 终端 profile 的「启动命令」是否带
/c chcp 65001 &&类指令——这类命令若写错位置(比如放在args末尾而非开头),会被忽略 - 如果你用了
oh-my-zsh或自定义.zshrc,检查是否有export LC_CTYPE=C这类强行降级 locale 的语句,它会覆盖 VSCode 传入的LC_ALL
乱码问题从来不是单一环节的事,最常被跳过的其实是「确认终端实际加载的 profile 是哪个」——用 echo $SHELL 和 ps -p $$ 对照看,别只信设置界面里写的默认值。


















