VS Code 终端运行 Python 出现中文乱码的解决方法
在 VS Code 终端中运行包含中文的 Python 代码时,输出内容经常变成类似 ├╠或菱形问号等无意义字符。这种现象的根源在于“源码文件编码”、“Python 进程标准输出编码”与“VS Code 终端代码页”三者之间存在不匹配。本文将梳理这三个环节的数据流转机制,并提供从源头规范、终端配置到环境配置的完整解决方案。
一、乱码现象与问题根源:编码链路断层
在 Windows 环境下,VS Code 终端默认调用 PowerShell 或 CMD。乱码通常不是单一软件损坏造成的,而是字符在传递过程中遭遇了两次不同规则的转换。
完整的数据流包含三个核心节点:编辑器以特定编码(现行标准通常为 UTF-8)保存 .py 脚本;Python 解释器读取该文件,并在运行时决定向标准输出(stdout)发送什么字节序列;最后,VS Code 终端捕获这些字节,并使用当前终端的“活动代码页”(Active Code Page)进行文字还原。如果终端仍处于中文 Windows 默认的 GBK(代码页 936)模式,而接收到的是 UTF-8(代码页 65001)字节流,就会把双字节或三字节的字符拼装错乱,形成乱码。
二、排查与修复步骤
彻底消除乱码需要按照“检查文件自身编码 → 统一终端代码页 → 约束 Python 运行环境”的先后次序逐一排查。
第一步:确认并修改文件保存编码
如果 Python 脚本最初是在其他平台或老旧编辑器中创建的,文件本身可能采用 GB2312 或 GBK 编码保存,而 VS Code 默认按 UTF-8 读取,或者反之。
- 查看 VS Code 界面最下方的状态栏右侧,找到编码标识(默认通常显示
UTF-8)。 - 如果当前显示的不是
UTF-8,点击该位置,顶部会弹出两个选项:“通过编码重新打开 (Reopen with Encoding)” 和 “通过编码保存 (Save with Encoding)”。 - 选择 “通过编码保存”,在搜索框中键入
utf-8并回车确认。此时文件内容将以标准的无 BOM UTF-8 格式重写。
第二步:调整终端活动代码页(Active Code Page)
很多时候文件本身确实是 UTF-8 编码,但 Windows 内置终端默认代码页是 936(简体中文 GBK)。
可以在终端中输入以下命令进行验证:
chcp
如果输出结果显示:
活动代码页: 936
说明此时终端会把接收到的字节都当成 GBK 解码,遇到 UTF-8 中文字符就会产生乱码。可以通过输入以下命令,临时将当前终端会话切换为 UTF-8 模式:
chcp 65001
执行后终端会提示 Active code page: 65001。再次运行 Python 代码,通常即可正常显示。但这种方式在关闭终端窗口重新打开后会失效,下文将说明如何通过 VS Code 配置文件持久化生效。
第三步:在 settings.json 中持久化配置环境
为了避免每次新建终端都要手动输入 chcp 65001,建议直接在 VS Code 的配置文件中为终端和 Python 插件注入编码约束。
使用快捷键 Ctrl + Shift + P(macOS 为 Cmd + Shift + P),输入并选择 “Preferences: Open User Settings (JSON)”,在打开的 settings.json 文件中追加如下配置:
{
// 强制终端启动时设定环境变量,使 Python 标准输出使用 UTF-8
"terminal.integrated.env.windows": {
"PYTHONIOENCODING": "utf-8"
},
// 为 Windows PowerShell 自动附加 UTF-8 参数
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"args": ["-NoExit", "-Command", "chcp 65001 > $null"]
}
}
}
三、两种解决路径的差异:临时调整 vs 全局/持久化修改
在实际解决乱码时,开发者往往面临两种策略:是在代码内临时调用 sys.stdout.reconfigure,还是通过 VS Code 配置文件统筹环境。下表与架构图展示了两者的差异及适用场景。
| 对比维度 | 代码级临时修补 (Python 脚本内) | 环境级持久化配置 (VS Code settings.json) |
|---|---|---|
| 实现方式 | 在代码开头显式执行 sys.stdout.reconfigure(encoding='utf-8') |
配置 PYTHONIOENCODING 环境变量与 chcp 65001 |
| 侵入性 | 高。修改了项目业务代码,与业务逻辑无关的代码混入源码中。 | 无。仅在本地开发工具层生效,业务代码保持纯净。 |
| 跨平台兼容 | 部分平台可能产生重复重定向或不必要的兼容性开销。 | 良好。不同系统只需在 settings.json 中对应平台设置即可。 |
| 适用场景 | 单次排错验证、无法修改环境的受限容器内。 | 日常长期开发、多人协作统一环境规范。 |
四、验证测试与结果确认
完成上述配置后,需要通过一段包含字符串字面量、控制台交互以及异常打印的脚本来验证是否已彻底解决乱码。
新建一个名为 test_encoding.py 的文件,写入以下完整示例代码:
# -*- coding: utf-8 -*-
import sys
def verify_terminal_encoding():
print(f"当前标准输出编码 (stdout.encoding): {sys.stdout.encoding}")
print(f"系统默认编码 (getdefaultencoding): {sys.getdefaultencoding()}")
test_chinese_str = "中文测试:你好,VS Code!"
print("【直接打印测试】:", test_chinese_str)
if __name__ == "__main__":
verify_terminal_encoding()
在终端中通过 python test_encoding.py 执行,正确的输出示例如下:
当前标准输出编码 (stdout.encoding): utf-8
系统默认编码 (getdefaultencoding): utf-8
【直接打印测试】: 中文测试:你好,VS Code!
如果 stdout.encoding 显示为 utf-8,且下方中文字符完整无畸变,则说明整个输入输出链条的编码映射已完全对齐。
五、总结:避免乱码的核心检查清单
排查 VS Code 终端乱码问题并不复杂,只要按顺序保证“源文件无损坏”、“解释器输出明确”、“终端渲染一致”,乱码问题即可稳定规避。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













