VSCode终端乱码本质是文件读取、Shell启动、输出流解码三处编码未对齐,需清除terminal.integrated.profiles.windows及defaultProfile配置、检查PowerShell $PROFILE中[Console]::OutputEncoding、清理launch.json的env字段和系统级环境变量,并重启VSCode验证。

VSCode终端编码乱码不是“坏了”,而是你改过某些配置后,终端启动链路里某处编码被覆盖或冲突了——重置的关键不是删设置,是让三处编码重新对齐:文件读取、Shell 启动、输出流解码。直接删 settings.json 里的编码字段往往没用,因为真正起效的可能是被忽略的 profile 配置、环境变量,甚至 PowerShell 的 $OutputEncoding。
terminal.integrated.profiles.windows 配置残留最常导致“重置无效”
很多人以为删掉 terminal.integrated.encoding 就清空了,其实这个字段早在 VSCode 1.80+ 就被弃用了,设了也无效。真正控制终端行为的是 terminal.integrated.profiles.windows ——它定义了 PowerShell 或 cmd 启动时执行什么命令。如果你之前配过 chcp 65001 或 $env:PYTHONIOENCODING='utf8',但没同步更新 defaultProfile,新终端就会按旧 profile 启动,而你根本看不到提示。
- 打开
settings.json,删掉整个"terminal.integrated.profiles.windows"块(包括里面所有"PowerShell"、"cmd"子项) - 同时确认
"terminal.integrated.defaultProfile.windows"这一项也一并删掉,让它回归 VSCode 默认逻辑 - 关闭所有已打开的集成终端窗口(不是关标签页,是关整个终端面板),再新建一个
- 新开终端后立即运行
chcp,看是否回落到936(GBK)——这是 Windows 原生状态,说明 profile 已清空
PowerShell 的 $OutputEncoding 是隐藏开关
即使你清空了 VSCode 设置,PowerShell 自身仍可能保留会话级编码设置。它不依赖 VSCode,而是由 PowerShell 启动时加载的 profile 脚本决定。如果之前在 $PROFILE 里写过 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8,那每次开新 PowerShell 终端都会强制 UTF-8,和 VSCode 的默认行为打架。
- 在 VSCode 终端里运行
Get-Content $PROFILE,检查是否有编码相关语句 - 临时验证:新开一个独立的 PowerShell 窗口(不通过 VSCode),运行
[Console]::OutputEncoding,看输出是不是System.Text.UTF8Encoding - 若确认是 profile 导致,注释或删掉对应行,然后重启 VSCode(profile 只在 shell 启动时加载)
Debug Console 和集成终端不是一回事
很多人重置完终端,发现 F5 调试时 Debug Console 还是乱码,就以为重置失败。其实 Debug Console 完全不读 terminal.* 配置,它走的是 launch.json 里的 env 字段,且只对当前 launch 配置生效。
- 检查项目根目录下
.vscode/launch.json,找"configurations"数组里的每个对象 - 删掉所有
"env": { "PYTHONIOENCODING": "..." }或"env": { "NODE_OPTIONS": "..." }这类手动加的编码环境变量 - 如果没配过
env,但 Debug Console 仍乱码,说明调试器(如 ptvsd、cppvsdbg)本身 fallback 到系统 locale,此时必须靠系统级修复(见下条)
真正难重置的,是那些跨进程继承的环境变量——比如你在某个终端里执行过 set PYTHONIOENCODING=utf8,它只影响当前 cmd 进程;但如果你把它写进了系统环境变量,或者通过 terminal.integrated.env.windows 全局注入,那它就会像影子一样跟着每个新终端。这类配置不会显示在 profile 里,得去 Windows 系统属性 → 高级 → 环境变量里手动清理。











