Linux系统应直接修改/etc/locale.conf并用localectl set-locale生效,确认时需用locale、localectl status和locale -a | grep zh_CN.utf8三者交叉验证,确保LANG与LC_ALL一致且zh_CN.utf8已安装,终端客户端也须设为UTF-8。

直接改 /etc/locale.conf 就行,不需要动 /etc/environment 或用户级配置文件,否则容易冲突失效。
怎么确认当前字符集是否生效
别只看 echo $LANG,它可能被 shell 会话临时覆盖。真正权威的是:
-
locale—— 查所有 LC_* 变量,重点看LANG和LC_ALL是否一致且为zh_CN.UTF-8或en_US.UTF-8 -
localectl status—— systemd 系统实际加载的系统级 locale,这才是重启后真正起效的值 -
locale -a | grep zh_CN.utf8—— 如果没输出,说明中文语言包根本没装,改配置也没用
修改前必须先检查并安装中文语言包
CentOS 7 默认不带 zh_CN.UTF-8 locale,直接写进配置文件是无效的。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 运行
locale -a | grep zh_CN.utf8,若无输出,先执行:yum install kde-l10n-Chinese - 装完再查一次,应出现
zh_CN.utf8(注意大小写和点号,不是UTF-8) - 如果只看到
zh_CN.GB18030或zh_CN.GB2312,说明装的是旧包,建议换源或重试
只改 /etc/locale.conf 并 reload,别碰其他文件
/etc/locale.conf 是 systemd 唯一认的系统级 locale 配置文件。其他路径如 /etc/environment、/etc/profile、~/.bashrc 都是干扰项,改了反而导致 LC_ALL 被覆盖或优先级混乱。
- 用 root 运行:
echo "LANG=zh_CN.utf8" > /etc/locale.conf(注意是.utf8,不是.UTF-8) - 立即生效:
localectl set-locale LANG=zh_CN.utf8(该命令会重载并验证配置) - 验证:
localectl status输出中 “System Locale” 应显示LANG=zh_CN.utf8 - 不用重启,但新登录的终端/服务才继承该设置;已有 ssh 会话需重新连接或
source /etc/locale.conf
为什么终端还是乱码?检查终端本身编码设置
系统 locale 改对了,但 SecureCRT、PuTTY、GNOME Terminal 等客户端默认可能仍用 ISO-8859-1 或 GBK。这和系统无关,纯属客户端渲染问题。
- SecureCRT:选项 → 会话选项 → 外观 → 字符编码 → 设为
UTF-8 - PuTTY:窗口 → 外观 → 字符集 → 设为
UTF-8 - GNOME Terminal:编辑 → 首选项 → 当前配置文件 → 兼容性 → 字符编码 →
UTF-8 - 如果连
ls中文文件名都显示为???,说明不是终端问题,而是上面某步漏了(比如没装语言包或localectl没生效)
最常被忽略的点:locale 名字必须严格匹配 locale -a 输出的拼写,少一个点、大小写错、多下划线都会让配置静默失败;LC_ALL 一旦被设成空值或非法值,会直接压倒 LANG,导致整个 locale 退化为 C。

















