windows vs code终端中文乱码主因是gbk与utf-8编码冲突:系统终端默认gbk,而node/python等按utf-8解析;需通过$outputencoding=[system.text.utf8encoding]::new()(powershell)、chcp 65001(cmd)或pythonioencoding=utf-8(python)分别修复。

Windows 下 VS Code 终端中文乱码是因为系统编码没对上
VS Code 默认复用系统终端(如 PowerShell 或 cmd),而 Windows 中文版默认用 GBK 编码,但 Node.js、Python 等工具链普遍按 UTF-8 解析输出——两边不一致,字就变成 或一堆问号。
别急着改 VS Code 设置,先确认终端本身能不能正常显示中文:
- 在 VS Code 内置终端里直接输入
echo 你好,看是否乱码;如果乱码,说明是终端层问题,不是 VS Code 的锅 - 打开系统原生的 PowerShell,执行
[Console]::OutputEncoding,大概率返回System.Text.SBCSCodePageEncoding(即 GBK) - Python 脚本里 print("中文") 输出乱码?很可能是 Python 没告诉自己该用 UTF-8 解释 stdout
PowerShell 终端里改 $OutputEncoding 最快见效
这是最轻量、不改全局配置的临时解法,适合日常开发。PowerShell 启动时默认不设 $OutputEncoding,它就跟着控制台代码页走;手动指定后,所有子进程(比如你跑的 node app.js)输出都会被正确转成 UTF-8 字节流。
操作很简单,在 VS Code 终端里粘贴运行:
$OutputEncoding = [System.Text.UTF8Encoding]::new()
注意:这个只对当前会话有效。想一劳永逸,可以把它加进 PowerShell 的配置文件 $PROFILE(先运行 notepad $PROFILE 确保文件存在,再追加上面那行)。
- 别用
[Console]::OutputEncoding = ...—— 它只影响 .NET 控制台 API,对 Node/Python 进程无效 - 别设成
UTF7或ASCII,那是自找麻烦 - 如果你用的是 Git Bash,这招不适用,得换别的路子
VS Code 启动终端前强制设环境变量 chcp 65001
cmd 和旧版 PowerShell 依赖 chcp(Change Code Page)命令切换活动代码页。chcp 65001 就是切到 UTF-8 模式,比改 PowerShell 变量更底层,连 C++ 程序 printf 都能救回来。
VS Code 允许你在终端启动前自动执行命令,路径是:settings.json → 加入:
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"args": ["-NoExit", "-Command", "chcp 65001 > $null"]
}
}
- 一定要加
-NoExit,否则终端启动完就退出 -
> $null是为了隐藏那行 “活动代码页: 65001” 提示,不然每次开终端都闪一下 - 如果你主要用
cmd,把 profile 名改成"Command Prompt",command 改成cmd /c chcp 65001 - 此设置不影响已打开的终端,新开一个才生效
Python 脚本单独输出乱码?检查 sys.stdout.encoding
即使终端编码设对了,Python 有时仍会固执地用 cp936(GBK)去 decode 自己的 stdout,尤其在没设环境变量或用了某些 IDE 封装时。
快速验证:在脚本开头加一行:
import sys; print(sys.stdout.encoding)
如果输出是 cp936,就得干预:
- 启动时加环境变量:
set PYTHONIOENCODING=utf-8(Windows)或export PYTHONIOENCODING=utf-8(WSL/macOS) - 或者在代码里强制重置(不推荐长期用):
import io; sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') - 用
print("中文", encoding='utf-8')是错的——print没有encoding参数
真正容易被忽略的是:VS Code 的“运行 Python 文件”按钮(▶️)走的是自己的调试器管道,不经过终端,所以即使终端调好了,点这个按钮还是可能乱码。这时候必须靠 PYTHONIOENCODING 或改 Python 启动配置。










