sublime打开gbk文件乱码的根源是默认用utf-8解码gbk字节流,正确做法是先file→reopen with encoding→chinese (gbk)恢复显示,再file→save with encoding→utf-8真转码,并配"fallback_encoding":"chinese (gbk)"和"default_encoding":"utf-8",禁用detect_encoding,加"save_with_bom":false防python报错。

Sublime 打开 GBK 文件乱码,不是软件坏了,是它根本没猜对编码——默认用 UTF-8 去解 GBK 字节流,两个字节被当一个字符,结果就是满屏 □ 或 ä½ å¥½。必须手动告诉它“试试 GBK”,而不是调设置、装插件、点右下角硬切。
点右下角“UTF-8”切换编码?这是最危险的操作
状态栏右下角显示的 UTF-8 只是 Sublime 当前怎么读这个文件,不是文件真实编码。你点它 → 切成 Chinese (GBK),它就用 GBK 解一遍;再点回 UTF-8,它又用 UTF-8 解一遍——两次都是错的,还可能固化双重乱码。
- 真正安全的操作只有
File → Reopen with Encoding → Chinese (GBK):只改视图,不碰磁盘 - 看到中文正常显示后,立刻执行
File → Save with Encoding → UTF-8:这才是真转码 - 绝对不要点
Convert to UTF-8(老版本菜单里有),它静默重写文件,且不提示 - 如果
Reopen with Encoding列表里没有Chinese (GBK),先装Codecs37插件(Ctrl+Shift+P→Install Package→ 搜Codecs37)
fallback_encoding 写 "UTF-8" 就等于没写
fallback_encoding 这个字段不接受标准编码名,写 "UTF-8" 是无效配置。Sublime 内部只认自己注册的标识符,比如 Chinese (GBK)、Western (ISO 8859-1)。
- 正确写法:
"fallback_encoding": "Chinese (GBK)"—— 让它在无 BOM、无声明的老文件上优先试 GBK - 必须配着
"default_encoding": "UTF-8"一起用:前者管“怎么读旧文件”,后者管“新文件和保存时用啥” - 删掉配置里可能存在的
"detect_encoding": true:这个开关会让 Sublime 主动跳过 UTF-8 去试 GBK,反而把带 BOM 的 UTF-8 文件判成乱码 - 改完配置不用重启 ST4,基本实时生效;ST3 部分版本需重启
Save with Encoding → UTF-8 后,Python 报 SyntaxError: Non-UTF-8 code starting with '\xef'
这不是转码失败,是 Sublime 默认加了 UTF-8 BOM(\xef\xbb\xbf),而 Python、Git、Shell 脚本都把它当非法字符。
- 检查是否生效:保存后运行
xxd 文件名 | head -n1,输出不含ef bb bf才算干净 - 必须加这行配置:
"save_with_bom": false,只靠"default_encoding": "UTF-8"不够 - 别信“确保末尾换行”能解决 BOM 问题:
"ensure_newline_at_eof_on_save": true和 BOM 无关 - 如果已存出带 BOM 的文件,用
File → Reopen with Encoding → UTF-8再Save with Encoding → UTF-8(注意不是 UTF-8 with BOM)
ConvertToUTF8 插件该不该用?ST4.4+ 上基本失效
ConvertToUTF8 已多年未维护,在 ST4.4+ 上常出现状态栏不显示真实编码、自动转码失灵、保存后仍乱码等问题——不是你配错了,是插件根本没跑起来。
- 推荐换
Codecs37:支持 GBK/GB18030/UTF-8-BOM/Shift-JIS 等 30+ 编码,持续更新,装完即用 - Codecs37 不会自动改文件内容,只是帮你识别和切换:打开 GBK 文件自动显示
GBK在状态栏,点击即可选保存为 UTF-8 - 它不解决构建系统输出乱码(那是
PYTHONIOENCODING或终端chcp的事),也不批量转码 - 批量转码别图快:所谓“一键转 GBK 为 UTF-8”的脚本本质是赌概率,一旦把 UTF-8-BOM 文件误判为 GBK,转完就毁了
最麻烦的其实是混合编码文件——比如从 Word 复制进来的文本,含隐藏控制字符,Sublime 无法统一识别。这种得先 Reopen with Encoding → UTF-8,再手动删异常字符。BOM 和混合编码,才是日常中最容易被忽略、却最要命的两个点。











