根本原因是构建系统未显式配置"encoding":"utf-8",必须用"cmd"数组模式、绝对路径python、-u参数三者齐备,并手动切换构建系统生效。

Sublime 构建系统输出中文乱码,根本不是文件编码问题,而是构建系统没告诉 Python 子进程“用 UTF-8 解码 stdout 字节流”——必须在 .sublime-build 文件里用 "cmd" 数组模式、绝对路径 Python、-u 参数,并显式写对 "encoding": "utf-8",否则 Windows 下必乱。
为什么 shell_cmd 写法一定无效
"shell_cmd": "python -u $file" 看起来简洁,但 Sublime 完全忽略其中的 "encoding" 字段,直接退回到系统 locale(Windows 默认是 cp936)去 decode Python 输出的 UTF-8 字节。结果就是 print("中文") 变成 涓枃 或方块。
-
"cmd"是唯一能触发"encoding"生效的模式 -
"shell_cmd"模式下设"encoding": "utf-8"等于没写 - 即使加了
-u,输出仍被错误解码,肉眼可见乱码
"encoding": "utf-8" 的大小写和拼写必须严格匹配
这个字段名和值都区分大小写、连字符、字母形式,错一个就失效:
- 字段名只能是
"encoding",写成"Encoding"、"output_encoding"、"encodings"全部不认 - 值只能是
"utf-8"(小写、带短横),"UTF-8"、"utf8"、"Utf-8"全部无效 - 它只影响 Sublime 对子进程
stdout字节流的解码行为,和文件保存无关
必须用绝对路径 + -u + "cmd" 三件套
漏掉任意一项,中文输出可能卡住、截断或解码失败:
-
"cmd"必须是数组形式:["D:/Python39/python.exe", "-u", "$file"],不能写"python"(环境变量不可控) -
-u参数不可省:Python 默认缓冲stdout,中文可能迟迟不输出,尤其带换行前缀时 - 路径中反斜杠需转义或改用正斜杠:
"D:\Python39\python.exe"或"D:/Python39/python.exe" - Mac/Linux 用户同样要配:只要终端
LANG不是 UTF-8(如en_US.ISO-8859-1),一样乱
改完配置后必须手动切换构建系统
很多人改完 .sublime-build 文件就以为生效了,其实 Sublime 不会自动加载新配置:
- 保存文件后,必须进
Tools → Build System → Python3(或你命名的构建系统名)手动选中一次 - 不切换,Sublime 仍走默认构建系统,
"encoding"彻底不生效 - 验证是否真生效:写个
test.py,内容仅一行:import sys; print(sys.stdout.encoding),运行后输出必须是utf-8
最容易被忽略的是:构建系统配置和文件编码是两件事——哪怕你文件是 GBK 编码,只要构建系统正确设置了 "encoding": "utf-8",Python 输出的中文照样能正常显示;反过来,文件是 UTF-8,构建系统没配对,照样乱码。











