终端启动时自动使用zh_CN.UTF-8,需在~/.profile中添加export LANG=zh_CN.UTF-8和export LC_CTYPE=zh_CN.UTF-8,再执行source ~/.profile生效;务必确保系统已生成该locale(locale -a | grep zh_CN.UTF-8),且不设LC_ALL以免覆盖。

怎么让终端启动时自动用指定字符集(比如 zh_CN.UTF-8)
终端默认字符集不是靠终端软件自己决定的,而是继承自 shell 启动时加载的 LANG 和 LC_CTYPE 环境变量。所以关键不是改终端设置,而是确保每次打开终端时这些变量已正确设置。
最稳妥的做法是写入用户级 shell 初始化文件:
-
~/.bashrc或~/.profile(推荐后者,因为~/.bashrc在非交互式 shell 下可能不加载) - 添加两行:
export LANG=zh_CN.UTF-8export LC_CTYPE=zh_CN.UTF-8 - 避免设
LC_ALL—— 它会强制覆盖所有 locale 分类,调试时反而难定位问题 - 改完后执行
source ~/.profile生效,或新开终端验证:locale | grep -E "LANG|LC_CTYPE"
为什么 locale-gen 之后终端还是显示乱码
常见原因是:系统没生成对应 locale,或生成了但没启用,或终端本身不支持该编码显示。
分三步排查:
- 运行
locale -a | grep zh_CN,确认zh_CN.UTF-8(或你要用的如zh_CN.GBK)确实在列表里;没有就先执行sudo locale-gen zh_CN.UTF-8 - 检查
/etc/locale.gen是否有对应行未被注释(如zh_CN.UTF-8 UTF-8),若有则需再跑一次sudo locale-gen - GNOME Terminal、Konsole 等现代终端默认只支持 UTF-8;若你硬要用
zh_CN.GB2312,得在终端菜单里手动切换编码(终端 → 设置字符编码 → GB2312),且仅对当前会话有效
/etc/default/locale 和 /etc/environment 哪个优先级更高
两者都影响全局环境,但行为不同:
-
/etc/default/locale是 Debian/Ubuntu 特有机制,只在系统初始化阶段被update-locale工具读取,用于生成/etc/environment的初始内容;它本身不直接生效 -
/etc/environment是 PAM 直接加载的静态键值对,无 shell 解析,**不支持$PATH展开或条件逻辑**,但对所有登录会话(包括 SSH、图形界面)都生效 - 如果两个文件都设了
LANG,/etc/environment里的值会胜出;但更推荐只用/etc/default/locale+sudo update-locale LANG=zh_CN.UTF-8,避免手写错误
终端能显示中文,但 vim/less/ps 等命令仍乱码怎么办
这些命令依赖 LC_CTYPE 控制字符分类和宽字符处理,只设 LANG 不够。
必须显式设置:
-
export LC_CTYPE=zh_CN.UTF-8(和LANG保持一致) - 某些老工具(如
ls的颜色输出)还依赖LC_COLLATE,可一并设为相同值 - 不要设
LC_ALL=C—— 这是很多脚本里为了“兼容性”加的,但它会彻底禁用 locale,导致中文完全无法解析 - 验证方式:
locale -k LC_CTYPE应输出非空值,printf '\u4f60' | cat能正确打印“你”字
LANG,覆盖服务器设置。如果远程连接后 locale 又变回英文,检查客户端是否设置了 SendEnv LANG LC_* 并在服务器 /etc/ssh/sshd_config 中禁用对应接收项。


















