必须先定位乱码发生在Output面板还是Terminal面板:前者只与文件保存编码和Code Runner配置有关,chcp、PYTHONIOENCODING等全部无效;后者才涉及terminal.integrated.encoding、shell环境变量及代码页设置。

VSCode输出中文乱码不是文件损坏,而是编码链断在了某一层——必须先定位乱码发生在 Output 面板还是 Terminal 面板,否则所有设置都白调。
确认乱码位置:Output 面板 vs Terminal 面板
这是最关键的一步,90% 的人跳过它直接改设置,结果越调越乱。
-
Output面板(快捷键Ctrl+Shift+U)是 Code Runner、调试器等扩展“模拟”出来的日志窗口,不走系统终端,chcp、PYTHONIOENCODING、terminal.integrated.encoding全部无效 -
Terminal面板(快捷键Ctrl+`)才是真实 shell 进程,支持代码页切换和环境变量,chcp 65001和export LANG=zh_CN.UTF-8在这里才起作用 - 点右下角状态栏的编码标识(如
UTF-8),选Reopen with Encoding切换读法,能立刻恢复中文 → 说明文件本身是 GBK 编码,VSCode 读错了;切完更乱 → 换 GB2312 或 Big5 再试
Output 面板乱码:只改 Code Runner + 文件保存编码
Code Runner 默认把 g++、gcc、python 等命令的输出塞进 Output 面板,它不认终端设置,只认你存文件时用的编码 + 它自己拼的执行命令。
- 确保源文件以 UTF-8 无 BOM 保存:右下角点
UTF-8→Save with Encoding→ 选UTF-8(别勾“with BOM”) - 修改
code-runner.executorMap,给 C/C++ 加编译参数:-finput-charset=utf-8 -fexec-charset=utf-8 - 如果用的是 Windows + MinGW/g++,必须加
chcp 65001 &&前缀,因为每次运行都新开 cmd 实例,代码页会重置为默认 936 - 示例(C 语言):
"c": "chcp 65001 >nul && gcc -finput-charset=utf-8 -fexec-charset=utf-8 $fileName -o $fileNameWithoutExt && chcp 65001 >nul && ./$fileNameWithoutExt"
Terminal 面板乱码:分 Windows / WSL 处理环境层
这里的问题本质是 shell 进程接收到的字节流和它预期的解码方式不匹配。不是 VSCode 的锅,是终端环境没对齐。
- Windows cmd:
terminal.integrated.encoding必须设为utf8(全小写),且在用户级settings.json中配,工作区级不生效 - Windows PowerShell:除了
terminal.integrated.encoding,还需加启动命令:pwsh.exe -NoExit -Command "chcp 65001 | Out-Null" - WSL(Ubuntu/Debian):检查
locale输出是否含UTF-8;若否,在~/.bashrc或~/.zshrc末尾加:export LANG=en_US.UTF-8,然后source ~/.bashrc - Python 脚本单独乱码?在终端里先运行
set PYTHONIOENCODING=utf8(Windows)或export PYTHONIOENCODING=utf8(WSL),再跑脚本
容易被忽略的硬伤:autoGuessEncoding 和文件后缀绑定
VSCode 的 files.autoGuessEncoding 是个陷阱——它对 GBK 文件识别率极低,常误判成 windows1252,一保存就炸。
- 全局关掉它:
"files.autoGuessEncoding": false,永远别信自动猜 - 老项目混着 GBK 的
.txt、.log、.ini?在项目根目录.vscode/settings.json里精准绑定:"files.associations": {"*.txt": "gbk", "*.log": "gbk"} -
"files.encoding"值必须写utf8(全小写),写成UTF-8或UTF8,VSCode 直接静默忽略 - Git 日志乱码?那是 Git 自己的编码配置问题,和 VSCode 无关:
git config --global i18n.logOutputEncoding utf8


















