chcp 65001在powershell 7+中不生效,因其默认禁用该命令;需先执行set-executionpolicy remotesigned -scope currentuser启用脚本权限,并通过settings.json配置shellargs或$profile追加[console]::outputencoding = [system.text.encoding]::utf8实现永久utf-8支持。

chcp 65001 不生效?先确认终端类型和执行时机
PowerShell 7+ 默认禁用 chcp,直接运行会报“命令未识别”。必须先执行 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 启用脚本权限。即使权限 OK,chcp 65001 也只对当前会话有效——新开终端又变回 936(GBK)。
真正起效的方式是让终端启动时就加载 UTF-8:
- PowerShell:在
settings.json中配置"terminal.integrated.shellArgs.windows",值为["-NoExit", "-Command", "chcp 65001 > $null"] - cmd:用
"terminal.integrated.profiles.windows"定义 profile,args设为["/K", "chcp 65001"] - 别写
chcp 65001 && powershell——管道链式命令会导致上下文丢失,chcp生效但后续 shell 不继承
Python 输出还是 ????检查 sys.stdout.encoding 是否真为 utf-8
即使终端代码页已是 65001,Python 解释器仍可能按系统默认代码页初始化 sys.stdout.encoding。运行 python -c "import sys; print(sys.stdout.encoding)",如果输出 cp936,说明 Python 自身没对齐。
必须通过环境变量强制覆盖:
- 在
settings.json中设置"terminal.integrated.env.windows",确保包含"PYTHONIOENCODING": "utf8" - 该变量影响
stdin/stdout/stderr的编码感知,不加它,print("中文")仍走 GBK 字节流 - 注意大小写:
PYTHONIOENCODING不是pythonioencoding,Windows 环境变量名区分大小写
PowerShell 自身输出仍是方块?补上 [Console]::OutputEncoding
PowerShell 5.1 及更早版本的 [Console]::OutputEncoding 默认绑定 [System.Text.Encoding]::Default(即 GBK),哪怕你已 chcp 65001,它也不自动更新。结果就是:Python 按 UTF-8 输出,PowerShell 却用 GBK 把字节喂给 VSCode,VSCode 再用 UTF-8 解——双重错位。
修复方式分临时和永久:
- 临时验证:在终端里手动执行
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - 永久生效:编辑 PowerShell 的
$PROFILE文件(若不存在则新建),末尾追加同一行,保存后重启 VSCode - PowerShell 7+ 用户也建议加,因
$PROFILE加载前的初始输出仍可能乱码
为什么改了 terminal.integrated.defaultEncoding 没用?
"terminal.integrated.defaultEncoding": "utf8" 这个设置纯属误导项。它只控制 VSCode 如何解码子进程 stdout 的字节流,**不改变子进程本身怎么写**。Python 还是按 cp936 吐字节,VSCode 就算用 UTF-8 去读,也是拿 UTF-8 解码器硬套 GBK 字节——必然出错。
真正要动的是两端:
- 写入端:靠
PYTHONIOENCODING、[Console]::OutputEncoding、chcp控制子进程输出编码 - 读取端:VSCode 默认就是 UTF-8 解码,无需额外配置(除非你故意改过)
- 字体不是主因:显示 ??? 或 “й你好” 是编码错位,不是缺字形;方块口字才是字体问题,别混着调
最常被忽略的一点:所有修改(尤其是 $PROFILE 和 settings.json)都必须重启 VSCode 才能完全生效。热重载终端窗口不等于重载整个终端子系统。











