必须同时满足三个条件:用"cmd"数组模式、设"encoding": "utf-8"、加-u参数;右下角显示utf-8仅表示源文件解码方式,控制台输出依赖构建系统中encoding字段对子进程stdout字节流的解码。

Sublime Text 控制台输出中文乱码,不是文件编码设成 UTF-8 就能解决的——问题卡在构建系统启动 Python 子进程时的 I/O 编码协商上,必须同时满足三个硬性条件才可能正常显示。
为什么改了文件编码和状态栏还是乱码
Sublime 右下角显示“UTF-8”,只代表它用 UTF-8 解析了源文件内容;控制台输出是另一条通路:Python 进程 stdout 写出的字节流,由构建系统里的 encoding 字段决定如何解码。常见误操作包括:
- 以为
default_encoding或状态栏切换能影响构建输出 - 在构建系统里写
"shell_cmd": "python -u $file"——shell_cmd模式下encoding字段完全被忽略 - 只加
-u参数却不配"encoding": "utf-8",缓冲区虽清空,但 Sublime 仍用系统 locale(如 GBK)去 decode 字节流
必须用 cmd 模式 + 绝对路径 + encoding 显式声明
shell_cmd 是无效路径,真正起作用的只有 cmd 数组模式。Windows 下尤其要避免依赖环境变量调用 python,因为子进程不继承终端的 chcp 设置。正确配置示例如下:
{
"cmd": ["C:/Python39/python.exe", "-u", "$file"],
"file_regex": "^[ ]*File \"(*?)\", line ([0-9]*)",
"selector": "source.python",
"encoding": "utf-8"
}
-
"cmd"字段必须是数组,不能是字符串 -
"encoding": "utf-8"必须小写、带短横,写成"UTF-8"或"utf8"都不生效 -
python.exe路径建议写绝对路径,避免因 PATH 变更或虚拟环境导致命令找不到 -
-u参数禁用 stdout 缓冲,否则中文可能卡在 buffer 不输出
# -*- coding: utf-8 -*- 的真实作用
这行声明只告诉 Python 解释器“怎么读我的源文件”,跟 print() 输出到控制台的编码无关。但它仍有实际价值:
- 确保含中文字符串的脚本在 Windows 下不会因 fallback 到 CP936 而报
SyntaxError - 避免某些旧版编辑器或 CI 环境误判源码编码
- 必须放在第一或第二行,且不能带 BOM;配合用户设置中
"save_with_bom": false才安全
Mac/Linux 用户也得配 "encoding": "utf-8"
别以为只有 Windows 有这问题。虽然多数 macOS/Linux 终端默认 locale 是 UTF-8,但一旦终端设为 en_US.ISO-8859-1 或 zh_CN.GB18030,同样会乱码。而且:
- Sublime 不读取终端 locale,它只看构建系统配置
-
env字段塞PYTHONIOENCODING=utf-8在 Windows 上基本无效(Python 官方已确认) - 跨平台协作时,统一写死
"encoding": "utf-8"是最稳做法
最容易被忽略的是:改完构建系统后,必须手动切换到新创建的 PythonUTF8.sublime-build,否则配置不会生效。另外,sys.stdout.encoding 在控制台输出中必须是 utf-8 才算真正对齐,可用 import sys; print(sys.stdout.encoding) 验证。











