根本原因是Python进程stdout编码与Sublime控制台解码逻辑不一致:需同时配置“cmd”含-u参数、“env”设PYTHONIOENCODING=utf-8和PYTHONUTF8=1、“encoding”为utf-8,三者缺一不可。

Sublime Text 内置控制台运行 Python 脚本时输出中文变成 ??、\xe4\xbd\xa0\xe5\xa5\xbd 或方块,根本原因不是文件编码错了,而是 Python 进程的 stdout 编码和 Sublime 控制台的字节解码逻辑没对齐——PYTHONIOENCODING 没生效,或构建系统没传 -u 参数。
为什么加了 # -*- coding: utf-8 -*- 还是乱码
这行只告诉 Python 解释器“怎么读你的源码”,跟 print() 输出到哪儿、用什么编码发出去完全无关。控制台看到的是 Python 进程写出来的原始字节流,它默认按系统 locale(Windows 是 GBK)编码,而 Sublime 控制台默认按 UTF-8 解码,字节对不上就炸成问号或乱码。
-
sys.stdout.encoding在 Sublime 构建中常是cp936(即 GBK),不是utf-8 - 即使文件保存为 UTF-8、也加了编码声明,
print("你好")发出的仍是 GBK 字节 - 构建系统里漏掉
"env": {"PYTHONIOENCODING": "utf-8"},环境变量就不生效
构建系统必须配全这三项
只改 encoding 字段或只加 env 都不够。真正起效的配置要同时满足三个条件:
- 用
-u参数启动 Python:避免 stdout 缓冲干扰编码判断,"cmd": ["python", "-u", "$file"] - 显式设置进程级输出编码:
"env": {"PYTHONIOENCODING": "utf-8", "PYTHONUTF8": "1"} - 构建系统自身声明编码:
"encoding": "utf-8"(这是 Sublime 解析控制台输出用的)
完整示例(保存为 PythonUTF8.sublime-build):
{
"cmd": ["python", "-u", "$file"],
"selector": "source.python",
"encoding": "utf-8",
"env": {
"PYTHONIOENCODING": "utf-8",
"PYTHONUTF8": "1"
}
}别碰 chcp 65001 和 start cmd
网上常见写法如 ["cmd", "/c", "chcp 65001 >nul && python -u $file"] 或调用外部 cmd 窗口,在 Sublime 构建里反而更糟:
-
chcp只改当前 cmd 窗口的代码页,但 Sublime 不走那套解码逻辑,字节流仍被按 UTF-8 解,结果更混乱 - 用
start cmd启动独立窗口,等于放弃 Sublime 控制台的所有集成能力(快捷键、错误跳转、实时刷新) - Windows Terminal 或 PowerShell 下行为不一致,容易在不同机器上表现不同
验证是否真生效的唯一方法
不要靠肉眼看中文是否显示正常——有些终端会做兼容性 fallback,看起来对,其实底层还是 GBK 字节。最可靠方式是写个测试脚本:
import sys
print("stdout encoding:", sys.stdout.encoding)
print("你好")运行后,第一行输出必须是 utf-8,才算真正对齐。如果还是 cp936 或空值,说明 PYTHONIOENCODING 没传进去,或者被系统级环境变量覆盖了。
注意:Sublime 的 env 字段不会覆盖全局变量,但会覆盖继承自系统的同名变量;如果 Windows 已设了 PYTHONIOENCODING=gbk,你这里写 utf-8 才能覆盖它。

















