shell_cmd写法一定失败,因为sublime在该模式下不解析encoding字段,而是用系统locale(如windows的cp936)解码utf-8输出,导致中文乱码;只有cmd数组模式才支持encoding,且需满足:cmd为绝对路径数组、含-u参数、encoding字段严格为小写"utf-8"。

为什么 shell_cmd 写法一定失败
很多人写 "shell_cmd": "python -u $file",再加 "encoding": "utf-8",结果中文还是乱码。这不是配置漏了,而是 Sublime 根本不读这个字段——shell_cmd 模式下,Sublime 不解析 encoding,而是直接用系统 locale(Windows 通常是 cp936)去解码 Python 输出的 UTF-8 字节流,一解就崩,显示问号或方块。
真正起作用的只有 cmd 数组模式。它强制 Sublime 进入“可控子进程”路径,此时 encoding 才会被识别和应用。
cmd 配置必须满足的三个硬性条件
缺一不可,否则 encoding 就是摆设:
-
"cmd"必须是数组,不能是字符串;例如:["D:/Python39/python.exe", "-u", "$file"],不是"python -u $file" - Python 可执行文件路径必须是绝对路径,不能写
"python"——环境变量调用不可控,Sublime 可能 fallback 到自带解释器或根本找不到 -
-u参数必须显式带上,否则print()的中文可能被缓冲住,迟迟不输出(尤其在无换行时)
encoding 字段的大小写与拼写陷阱
这个字段名和值都严格区分大小写和符号:
- 字段名只能是
"encoding",写成"Encoding"、"output_encoding"或"enc"全部无效 - 值只能是
"utf-8"(小写、带短横),"UTF-8"、"utf8"、"Utf-8"都不认 - 它只影响 Sublime 对子进程
stdout字节流的解码行为,和 Python 源文件编码无关
验证是否生效最简单的方法:写个 test.py,内容就一行:import sys; print(sys.stdout.encoding)。运行后输出必须是 utf-8,否则说明构建系统没生效。
改完配置后为什么还是乱码
常见原因不是配置错,而是没触发:
- 保存了
.sublime-build文件,但没在Tools → Build System里手动选中它——Sublime 不会自动切换 - Windows 路径用了反斜杠没转义,比如
"D:Python39python.exe",JSON 解析会把P当转义字符报错;应写成"D:/Python39/python.exe"或"D:\Python39\python.exe" - Python 路径写错导致启动失败,Sublime 会悄悄 fallback 到默认构建系统(即没配
encoding的那个),控制台输出自然还是乱码
Mac/Linux 用户别跳过这步:即使终端 locale 是 UTF-8,只要构建系统没显式声明 "encoding": "utf-8",跨平台协作或终端 locale 变更时仍可能出问题。统一写死最稳。











