sublime控制台中文乱码的根本原因是构建系统未对齐编码,必须用"cmd"数组模式、显式python绝对路径、加"-u"参数,并设"encoding": "utf-8",且改完需手动切换构建系统生效。

Sublime Text 控制台输出中文乱码,不是文件编码设错了,而是构建系统启动 Python 子进程时,stdout 编码没对齐——必须用 "cmd" 模式、显式 Python 路径、加 -u 参数,并强制声明 "encoding": "utf-8",改完还得手动切换构建系统才生效。
为什么 "shell_cmd" 写法一定失败
很多人照着网上教程写 "shell_cmd": "python -u $file",结果 "encoding": "utf-8" 完全不生效。这是因为 Sublime 在 shell_cmd 模式下根本不解析 encoding 字段,而是退回到 Windows 系统 locale(通常是 GBK)去解码子进程输出。Python 3 默认以 UTF-8 输出字节流,GBK 解码器一碰就崩,直接显示问号或方块。
必须改用 "cmd" 数组形式,并满足以下三点:
-
"cmd"是唯一能触发encoding字段生效的模式 - 路径必须是绝对路径,例如
"D:/Python39/python.exe",不能写"python"(环境变量调用不可控) -
-u参数必须显式带上,否则print()中文可能被缓冲卡住,迟迟不输出
"encoding": "utf-8" 的大小写和拼写敏感点
这个字段名和值都严格区分大小写和连字符:
- 字段名必须是
"encoding",写成"Encoding"或"output_encoding"都无效 - 值必须是
"utf-8"(小写、带短横),"UTF-8"、"utf8"、"Utf-8"全部不认 - 它只在
"cmd"模式下起作用,且仅影响 Sublime 对子进程stdout字节流的解码行为 - Mac/Linux 用户也得配,别以为只有 Windows 有这问题——只要终端 locale 不是 UTF-8(比如
LANG=en_US.ISO-8859-1),照样乱码
验证是否真正生效的最简方法
别靠肉眼猜,写个 test.py 一行代码就能确认:
import sys; print(sys.stdout.encoding)
运行后输出必须是 utf-8 才算对齐。如果还是 cp936 或 mbcs,说明构建系统配置没生效,常见原因有:
- 保存了
.sublime-build文件但没在Tools → Build System里手动选中它 - 路径里用了反斜杠
却没转义(Windows 下应写"D:\Python39\python.exe"或正斜杠"D:/Python39/python.exe") - Python 可执行文件路径错误,导致 Sublime 启动失败,悄悄 fallback 到默认构建系统
别白费力气折腾的几件事
这些操作在 Sublime 构建系统里基本无效,纯属浪费时间:
-
chcp 65001:只影响手动打开的 cmd 窗口,Sublime 启动的子进程不继承 -
"env": {"PYTHONIOENCODING": "utf-8"}:Windows 下对subprocess无效,Python 官方已确认 -
# -*- coding: utf-8 -*-:它只管“怎么读源码”,跟print()输出编码无关(不过建议保留,避免老项目混编出问题) - 改 Sublime 的
default_encoding或fallback_encoding:这两个只影响文件读写,对构建控制台输出零作用
真正起作用的永远只有三样:"cmd" 数组、-u 参数、"encoding": "utf-8"。少一个,乱码就还在。而且每次改完构建系统,必须手动切一次,Sublime 不会自动 reload。











