根本原因是构建系统未配置"encoding":"utf-8"且未用cmd模式调用python,导致sublime以gbk解码utf-8输出字节流;须新建build system,设"cmd"字段、"encoding":"utf-8"、"-u"参数及源文件编码声明。

Sublime Text 控制台输出中文乱码,根本不是文件编码设成 UTF-8 就能解决的——它卡在构建系统(Build System)启动 Python 子进程时的 I/O 编码协商上。Windows 下默认用 GBK 渲染,而 Python 3 默认以 UTF-8 输出,两者没对齐,print("你好") 就变成 。
为什么改了文件编码和编辑器设置还是乱码
Sublime 右下角显示 UTF-8,只代表它用 UTF-8 解析了源文件内容;控制台输出是另一个通道:Python 进程 stdout 的字节流怎么被 Sublime 构建系统解码,由构建配置里的 encoding 字段决定,和文件编码无关。常见错误包括:
- 误以为
default_encoding或状态栏切换能影响构建输出 - 在构建系统里写
"shell_cmd": "python -u $file"——shell_cmd模式下encoding字段完全被忽略 - 只加
-u参数却不配"encoding": "utf-8",缓冲区虽清空,但 Sublime 仍用系统 locale(如GBK)去 decode 字节流
必须显式配置构建系统的 encoding 和 cmd 模式
打开 Tools → Build System → New Build System,粘贴以下内容并保存为 PythonUTF8.sublime-build:
{
"cmd": ["python", "-u", "$file"],
"file_regex": "^[ ]*File \"(*?)\", line ([0-9]*)",
"selector": "source.python",
"encoding": "utf-8"
}
关键点:
- 必须用
"cmd"字段(不是shell_cmd),否则encoding不生效 -
"encoding": "utf-8"告诉 Sublime:子进程 stdout 的字节流按 UTF-8 解码 -
-u参数禁用 Python 缓冲,避免中文卡在 buffer 不输出 - 如果
python命令找不到,换成绝对路径,例如["C:/Python39/python.exe", "-u", "$file"]
源文件编码声明不能省,尤其 Windows 上
构建系统管输出,不管源码加载。即使 Python 3 默认读 UTF-8,Windows 下某些环境仍会 fallback 到系统 locale(CP936),导致含中文字符串的脚本直接报错或行为异常。务必在 Python 文件第一或第二行加上:
# -*- coding: utf-8 -*-
这不是冗余注释:
- 它明确告诉解释器“这个文件字节流应按 UTF-8 解码”
- 避免 Sublime 保存时带 BOM(
\xef\xbb\xbf)引发 Git/Python 报错 - 配合
"save_with_bom": false用户配置,才能保证干净 UTF-8
别信 chcp 65001 或 PYTHONIOENCODING 环境变量
在构建系统里加 "env": {"PYTHONIOENCODING": "utf-8"} 对 Windows 无效——Python 官方确认该变量在 Windows subprocess 中不被继承。临时执行 chcp 65001 也只影响手动打开的 cmd 窗口,Sublime 启动的子进程不继承这个设置。真正起作用的只有两件事:
- 构建系统中的
"encoding": "utf-8" - Python 进程自身用
-u强制无缓冲 + 源文件顶部的# -*- coding: utf-8 -*-
Mac/Linux 用户一般无此问题,因为其默认 locale 多为 UTF-8,但若终端 locale 是 en_US.ISO-8859-1,同样要加 "encoding": "utf-8"。











