Sublime Text控制台输出中文乱码与文件编码无关,根源在于构建系统对Python子进程stdout字节流的解码方式;必须使用cmd数组模式、显式指定"encoding": "utf-8"、加-u参数且用绝对路径调用Python,三者缺一不可。

为什么改文件编码和状态栏没用
右下角显示“UTF-8”只说明 Sublime 用 UTF-8 打开了你的源文件,和控制台输出完全无关。控制台(Build Results)显示的是 Python 进程 stdout 的字节流,Sublime 默认用系统 locale(Windows 下通常是 cp936)去 decode 这些字节——而 Python 3 默认以 UTF-8 输出,GBK 解码器一碰就崩,结果就是“涓枃”“”或问号。你改 default_encoding、装 ConvertToUTF8、切状态栏编码,全都不影响这一步。
必须用 cmd 模式配 "encoding": "utf-8"
shell_cmd 写法下,"encoding": "utf-8" 字段被 Sublime 完全忽略,这是硬性限制。唯一生效路径是 cmd 数组模式,且必须同时满足:
-
"cmd"值必须是数组,不能是字符串:["D:/Python39/python.exe", "-u", "$file"]✔️;"python -u $file"❌ -
"encoding"字段名必须小写,值必须是"utf-8"(带短横、全小写):"UTF-8"、"utf8"、"Encoding"全部无效 - Python 可执行路径必须是绝对路径,避免环境变量失效导致 fallback 到旧版本或失败
- 必须显式加
-u参数,否则print()中文可能卡在缓冲区不输出,尤其搭配input()时
验证是否真正生效的三行测试
别靠肉眼猜乱码有没有修好,写个最小脚本 test.py:
import sys
print("✅①你好")
print(sys.stdout.encoding)
print(len("✅"))
运行后必须同时满足:
- 第一行正常显示
✅①你好(不是?1你好或方块) - 第二行输出
utf-8(不是cp936或mbcs) - 第三行输出
1(说明 Unicode 字符数识别正确)
任一不满足,说明构建系统没生效——最常见原因是:保存了 .sublime-build 文件但没在 Tools → Build System 里手动选中它。
Windows 下别白费力气试这些
以下操作在 Sublime 构建系统里基本无效,纯属浪费时间:
-
chcp 65001:只影响手动打开的 cmd 窗口,Sublime 启动的子进程不继承 -
"env": {"PYTHONIOENCODING": "utf-8"}:Windows 下对subprocess无效,Python 官方已明确标记为无效 - 在构建命令里写
&& pause或start cmd /k ...:绕过控制台截断可以,但不解决乱码本质
真正容易被忽略的是:改完 .sublime-build 后,必须手动切换一次构建系统——Sublime 不会自动重载,也不会提示你“配置已更新”。

















