VSCode终端乱码根源是Windows下PowerShell/cmd默认GBK编码与UTF-8文件不兼容,需按shell类型分别修复:PowerShell配置$PROFILE启用UTF-8、cmd推荐Windows Terminal或chcp 65001、Git Bash检查LANG变量,且终端编码不由VSCode编辑器设置控制。

终端启动时默认编码不是 UTF-8
VSCode 终端(尤其是 Windows 上的 PowerShell 或 cmd)默认可能用 GBK 或 CP936,而你的文件、脚本、Git 输出等是 UTF-8 编码,一读就乱码。编辑器本身走的是文件系统直读 + 自动编码探测,所以显示正常,但终端进程不认 UTF-8 就会崩。
实操建议:
- 在 VSCode 设置里搜
terminal.integrated.defaultProfile.windows,确认你实际在用哪个 shell(比如powershell、git-bash、cmd),不同 shell 的修复方式不同 - PowerShell:必须确保执行
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8,且该命令要在每次启动时运行——加到$PROFILE里最稳 - cmd:改注册表太重,更推荐直接换用
Windows Terminal+ 配置"unicode" : true,或在 VSCode 终端设置里加启动参数:/K chcp 65001 >nul - Git Bash:默认已支持 UTF-8,但如果乱码,检查
~/.bashrc里有没有export LANG=zh_CN.GBK这类覆盖项,删掉或改成en_US.UTF-8
VSCode 终端继承了系统 locale 而非编辑器编码设置
很多人以为改了 files.encoding 或 files.autoGuessEncoding 就能影响终端,其实完全无关。终端的编码由 shell 进程自身决定,VSCode 只是“窗口”,不干预子进程的 stdout 编码协商逻辑。
常见错误现象:
- 编辑器里写好中文注释,运行
python script.py却输出乱码 -
git status显示中文路径成\344\273\243\347\256\241这种八进制转义 - Python 报错
UnicodeEncodeError: 'gbk' codec can't encode character—— 这说明 Python 检测到 stdout 是 GBK,但你传了 UTF-8 字符
关键点:
- Python 3.7+ 默认按环境变量
PYTHONIOENCODING或sys.stdout.encoding输出,后者由终端 shell 设定,VSCode 不接管 - Node.js 同理,
process.stdout.encoding来自终端,不是 VSCode 设置 - 别在代码里硬写
sys.stdout.reconfigure(encoding='utf-8'),治标不治本,还可能被子进程覆盖
Windows 下 PowerShell 的 $PROFILE 未生效或路径不对
很多人加了 [Console]::OutputEncoding = ... 到 $PROFILE,重启终端还是乱码,本质是 PowerShell 根本没加载那个文件——因为 $PROFILE 有四个可能路径,常用的是 $PROFILE.CurrentUserCurrentHost,但默认不存在,得手动创建。
实操建议:
- 在 PowerShell 终端里运行
echo $PROFILE,复制输出路径(通常是C:\Users\XXX\Documents\PowerShell\Microsoft.PowerShell_profile.ps1) - 用
Test-Path $PROFILE看是否存在;不存在就用New-Item -Path $PROFILE -Force创建 - 用
notepad $PROFILE打开,粘贴这行:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - 再开新终端,运行
[Console]::OutputEncoding,确认输出是System.Text.UTF8Encoding - 如果仍无效,检查 PowerShell 执行策略:
Get-ExecutionPolicy,若为Restricted,需临时设为RemoteSigned(Set-ExecutionPolicy RemoteSigned -Scope CurrentUser)
WSL 终端里中文正常,但 VSCode 集成终端却乱码
这是典型「终端复用」陷阱:你在 VSCode 里选的是 WSL,但底层启动方式可能是通过 code . 命令从 Windows 命令行打开的,此时 VSCode 继承了父进程的 Windows locale,而不是 WSL 的 LANG=en_US.UTF-8。
解决重点在启动入口:
- 不要从 Windows 的 cmd/PowerShell 里执行
code .启动 VSCode,改用 WSL 内部启动:code .必须在 WSL 的 bash/zsh 里运行 - 确认 WSL 中
locale输出含UTF-8;若无,编辑/etc/wsl.conf加[boot] command="service locale-gen",或手动sudo locale-gen zh_CN.UTF-8并设LANG=zh_CN.UTF-8 - VSCode 设置里关掉
terminal.integrated.env.windows下可能存在的CHCP或LANG覆盖项 - 如果用 Remote-WSL 插件,确保它已启用,且 VSCode 左下角显示 “WSL: Ubuntu” 类标识,否则仍是 Windows shell 假装在跑 WSL
真正麻烦的从来不是改哪一行代码,而是搞清当前终端到底是谁启动的、继承了谁的环境变量、又把编码交给了哪个层级去解释。多看一眼 ps -f 或 Get-Process -Id $PID,比反复改配置快得多。


















