windows命令行中文乱码主因是cmd/powershell默认gbk(代码页936)与vscode、python等工具链默认utf-8编码错位;需用chcp验证真实终端编码,同步设置$outputencoding(powershell)、pythonioencoding及文件编码,缺一不可。

命令行安装 VSCode 本身不会导致乱码——乱码只出现在你后续用 VSCode 打开文件、运行终端或查看输出时。真正的问题是 Windows 命令行环境(CMD/PowerShell)默认用 GBK(代码页 936),而 VSCode 编辑器、Python、Node.js 等现代工具链默认按 UTF-8 处理中文,两者在字节流解析层错位了。
确认当前终端真实编码是 GBK 还是 UTF-8
在 VSCode 集成终端或 Windows 命令行里直接运行:chcp。如果输出是 活动代码页: 936,说明终端正在用 GBK;如果是 65001,说明已切到 UTF-8。别信右下角状态栏或设置里写的“UTF-8”,chcp 才是唯一可信的终端层编码快照。很多用户改了 VSCode 设置却没关掉旧终端,chcp 仍显示 936,误以为配置失败。
PowerShell 终端输出中文乱码必须改 $OutputEncoding
PowerShell 默认输出编码不是 UTF-8,即使 chcp 65001 成功,Write-Host "你好" 仍可能乱码。这是因为 PowerShell 的 $OutputEncoding 变量控制 .NET 层输出字节流的编码,它和控制台代码页是两套机制。
- 临时修复:在终端里执行
$OutputEncoding = [System.Text.Encoding]::UTF8 - 永久生效:运行
notepad $PROFILE打开 PowerShell 配置文件,在末尾加一行[Console]::OutputEncoding = [System.Text.Encoding]::UTF8,保存后重启终端 - 注意:仅设
chcp 65001不足以解决 PowerShell 的 print/println 类输出乱码,必须同步改$OutputEncoding
VSCode settings.json 中 terminal.integrated.profiles.windows 配置陷阱
很多人在 settings.json 里配了 "terminal.integrated.profiles.windows",但新加的 profile 没被选为默认,或者 args 写错顺序导致命令未执行。
- PowerShell profile 必须显式写
"source": "PowerShell",不能只写"path": "pwsh.exe",否则 VSCode 无法自动注入$PROFILE - args 中
chcp 65001和$env:PYTHONIOENCODING='utf-8'要用-Command包裹,且需加> $null抑制输出干扰,例如:["-NoExit", "-Command", "$env:PYTHONIOENCODING='utf-8'; chcp 65001 > $null"] - 改完必须关闭所有已打开的集成终端窗口再新建——旧终端进程不会 reload 配置
Python 脚本 print("中文") 仍乱码?检查 PYTHONIOENCODING 和源码声明
终端编码设对了,Python 输出还是方块,问题大概率出在 Python 进程自身。Windows 上 Python 3 默认用系统 locale(GBK)解码源文件和处理 I/O,不依赖终端编码。
- 确保脚本第一行有
# -*- coding: utf-8 -*-(尤其老项目或含中文路径时,PEP 3120 的“默认 UTF-8”在某些 Windows Python 安装中不生效) - 运行时加参数:
python -X utf8 script.py(Python 3.7+),或提前设环境变量:set PYTHONIOENCODING=utf-8(Windows CMD)/$env:PYTHONIOENCODING="utf-8"(PowerShell) - 避免用
os.system("echo 你好"):子进程继承父进程编码,但 cmd.exe 无法正确 decode UTF-8 字节流,会二次转义;改用subprocess.run(..., encoding="utf-8")
最易被忽略的一点:VSCode 集成终端的编码配置和文件编辑器的编码配置完全独立。你把终端调成 UTF-8,不代表打开一个 GBK 文件就自动变正常——那只是文件内容本身的编码问题,得靠右下角点“GBK”→“Reopen with Encoding”手动指定,再“Save with Encoding”转存。别指望终端设置能“传染”给文件读取逻辑。











