Sublime Text控制台中文乱码的根本原因是构建系统未正确配置编码协商,必须在.sublime-build文件中使用"cmd"数组模式、指定Python绝对路径、添加"-u"参数,并同级设置"encoding":"utf-8",且修改后需手动切换构建系统生效。

Sublime Text 汉化后脚本输出中文乱码,和菜单汉化无关,只说明构建系统(.sublime-build)没配对 Python 子进程的编码链路。改字体、切右下角编码、装汉化包,全都不影响控制台里 print("你好") 的输出结果。
为什么 encoding 字段必须写在顶层,不能塞进 cmd 里?
Sublime 的 encoding 是告诉它“用什么编码去 decode 子进程 stdout 的字节流”,不是传给 Python 的参数。如果写成:"cmd": ["python", "-u", "$file", "encoding=utf-8"],Python 根本不认这个字符串——它会被当做一个位置参数传给脚本,毫无作用。
-
encoding必须和cmd、selector同级,是构建系统的顶层字段 - Windows 下默认用 GBK 解 UTF-8 字节,所以看到“浣犲ソ”或空格块,本质是解码错位
-
shell_cmd写法(如"shell_cmd": "python -u $file")会完全忽略encoding字段,必须用cmd数组模式
绝对路径 + -u 参数为什么不能省?
用 cmd 数组调用时,若只写 "python",Sublime 会依赖系统 PATHEXT 和环境变量找可执行文件,容易命中旧版本或非预期解释器;而 -u 强制 Python 使用无缓冲 stdout,否则中文可能卡在缓冲区不输出,看起来像“只打印一半”或“延迟出现”。
- Windows 示例:
"cmd": ["C:/Python311/python.exe", "-u", "$file"] - macOS/Linux 示例:
"cmd": ["/usr/local/bin/python3", "-u", "$file"] - 路径中不能有空格;若含空格(如
Program Files),必须用双引号包裹整个路径(但 Sublime 不支持 shell 转义,稳妥起见还是挪到无空格路径)
环境变量 PYTHONIOENCODING 在 Sublime 里为什么基本无效?
Python 官方文档明确标注:子进程继承的环境变量中,PYTHONIOENCODING 对由 subprocess.Popen 启动的解释器**不生效**。Sublime 正是用这种方式启动 Python,所以你在系统里设了该变量,或在构建系统里加 "env": {"PYTHONIOENCODING": "utf-8"},都大概率白搭。
- 别折腾
chcp 65001:它只影响手动打开的 cmd,不继承给 Sublime 的子进程 - 也别信“在构建系统里加
shell: true就能跑通环境变量”——这反而会让encoding字段彻底失效 - 唯一可靠路径:靠
encoding: "utf-8"+ 绝对路径 +-u三者闭环
保存后中文正常,但别人用记事本打开还是乱码?
说明你只做了 Reopen with Encoding,没做 Save with Encoding → UTF-8。Sublime 控制台输出乱码和文件磁盘编码是两件事:前者靠构建系统配置,后者靠你手动转存。而且必须选 UTF-8,不是 UTF-8 with BOM——BOM(\xef\xbb\xbf)会导致 Python 报 Non-UTF-8 code starting with '\xef',Git 提交失败,Shell 脚本解析出错。
- 验证是否干净:
xxd 文件名 | head -n1,输出不含ef bb bf - 用户设置里加
"save_with_bom": false,避免手滑点错 - 混合编码项目(比如同时有 UTF-8 脚本和 GBK 配置文件)没法全局解决,得靠右下角手动切编码,或用
.sublime-project绑定 per-folder 构建规则











