必须先用locale和locale -a | grep zh_cn确认现状,若无zh_cn.utf8则需安装glibc-langpack-zh并生成locale,再配置/etc/locale.conf中lang="zh_cn.utf8",同时确保ssh客户端编码设为utf-8。

确认当前 locale 状态再动手
别急着改配置文件,先用 locale 和 locale -a | grep zh_CN 看清楚现状。如果 locale -a 输出里压根没有 zh_CN.utf8 或 zh_CN.UTF-8,说明系统连中文 locale 数据都没生成——这时候直接改 /etc/locale.conf 是无效的,只会让 LANG 变量指向一个不存在的 locale。
常见错误现象:改完 /etc/locale.conf 重启后 locale 仍显示 LANG=(空值)或回退到 C locale,就是这个原因。
CentOS 7/8 必须安装语言包才能启用 zh_CN.UTF-8
CentOS 默认最小化安装不带中文语言支持,glibc-langpack-zh 是核心依赖:
- CentOS 7:
yum install -y glibc-langpack-zh - CentOS 8+:
dnf install -y glibc-langpack-zh(langpacks-zh_CN是旧包名,已弃用)
装完必须执行 locale -a | grep zh_CN 验证输出中出现 zh_CN.utf8 ——注意大小写不敏感,但文件名实际是小写 utf8,不是 UTF-8。
漏掉这步,localectl set-locale LANG=zh_CN.UTF-8 会静默失败,/etc/locale.conf 里写的值也起不了作用。
修改系统级字符集:只动 /etc/locale.conf,别碰 /etc/sysconfig/i18n
CentOS 7 及以后统一使用 /etc/locale.conf,/etc/sysconfig/i18n 已废弃。写错位置会导致配置不生效:
- 用 root 权限编辑
/etc/locale.conf - 内容只写一行:
LANG="zh_CN.utf8"(注意:不是UTF-8,也不是zh_CN.UTF-8,必须和locale -a输出完全一致) - 不要加
LC_ALL——它会覆盖所有其他 locale 变量,容易引发某些程序兼容性问题
改完无需重启,新登录的 shell 会自动加载;已有会话可执行 source /etc/locale.conf 或直接 export LANG=zh_CN.utf8 临时验证。
SSH 终端乱码?那是客户端没设对编码
即使系统 locale 正确,Xshell、SecureCRT、Windows Terminal 等客户端若编码设成 GBK 或 ISO-8859-1,照样显示方块。关键检查点:
- Xshell:右键 → “属性” → “终端” → “字符编码” → 选
UTF-8 - SecureCRT:“选项” → “会话选项” → “外观” → “字符编码” →
UTF-8 - macOS Terminal:默认一般没问题,但若用 iTerm2,请确认“Profiles → Text → Character Encoding”为
Unicode (UTF-8)
这点最容易被忽略:你花了半小时配系统,结果终端自己解码错了,白忙一场。
真正卡住人的地方往往不在配置本身,而在「locale -a 看不到 zh_CN.utf8」却硬要设 LANG,或者「SSH 客户端编码没调」就怀疑系统配错了。两处都验过,基本就没别的路了。











