terminus终端乱码根源在系统shell环境编码而非sublime设置,windows需用powershell显式设outputencoding为utf-8,macos/linux需确保locale含utf-8,fallback_encoding等编辑器配置对其无效。

Sublime Text 的内置终端(如 Terminus、ShellCommand 等插件)不继承编辑器的 default_encoding_on_save 或文件编码设置,它的字符编码由操作系统终端环境决定,不是靠 Sublime 的 JSON 配置能改的。
Terminus 插件启动的终端默认用系统 locale,不是 UTF-8?
Terminus 是 Sublime 最常用的终端插件,但它本身不控制终端底层的字符集——它只是把你的 shell(如 Windows 的 cmd.exe、powershell.exe,或 macOS/Linux 的 zsh/bash)套进一个面板里。所以乱码根本不在 Sublime 配置层,而在 shell 启动时的环境变量或代码页。
- Windows 上:
cmd.exe默认是代码页 936(GBK),即使你设了"default_encoding_on_save": "UTF-8",dir或python --version输出含中文路径/提示时仍会乱码 - 解决方法:在 Terminus 设置中强制指定 shell 启动命令,例如 PowerShell 加
-ExecutionPolicy Bypass -NoExit -Command "$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.Encoding]::UTF8" - macOS/Linux:检查
locale输出是否含UTF-8(如en_US.UTF-8),若为POSIX或空,则需在 shell 配置文件(~/.zshrc)中加export LANG=en_US.UTF-8
ShellCommand 插件执行脚本输出中文乱码
ShellCommand 这类直接调用 subprocess.Popen 的插件,默认使用系统默认编码解码 stdout/stderr 字节流。Windows 下常是 cp936,导致 Python 脚本 print("你好") 输出变成 \xe4\xbd\xa0\xe5\xa5\xbd 解错成乱码。
- 不要指望改
Preferences → Settings – User里的编码字段——它对 subprocess 无效 - 正确做法:在调用命令时显式指定
encoding='utf-8'(如果插件支持自定义参数),或改用Terminus并配好 shell 环境 - 临时验证:在 Sublime 控制台(
Ctrl+`)运行import subprocess; print(subprocess.check_output(['echo', '你好'], encoding='utf-8')),若报UnicodeDecodeError,说明系统默认编码不是 UTF-8
为什么改了 fallback_encoding 对终端没用?
fallback_encoding 只影响 Sublime 打开磁盘上文本文件时的解码逻辑,和进程通信、标准流读取完全无关。它连 View → Console 里的日志都不管,更不会干预 subprocess 的字节解码行为。
- 常见误操作:在用户设置里加
"fallback_encoding": "UTF-8",以为能“统一编码”,结果终端照旧乱码 - 真正要动的是操作系统层面:Windows 改注册表或用
chcp 65001(临时),macOS/Linux 改LANG和LC_ALL - 注意:Windows Terminal 或 Windows 11 的新终端默认已启用 UTF-8,但传统
cmd.exe仍需手动切换;Sublime 的 Terminus 若未指定 shell,很可能 fallback 到旧版 cmd
终端 UTF-8 问题本质是子进程环境配置,不是编辑器编码设置能覆盖的。最稳的路是:Windows 上换用 PowerShell + 显式设 [console]::OutputEncoding,macOS/Linux 上确保 locale 输出带 UTF-8——其他所有试图在 Sublime 设置里“一劳永逸”的方案,都会在某次系统更新或插件升级后失效。











