应先安装中文语言包 yum install glibc-langpack-zh,再执行 localedef -f utf-8 -i zh_cn zh_cn.utf8 生成 locale,最后在 /etc/locale.conf 中正确写入 lang=zh_cn.utf8(小写utf8、无引号),重启终端生效。

locale -a 查不到 zh_CN.UTF-8 怎么办
直接执行 localectl set-locale LANG=zh_CN.UTF-8 报错 “Locale zh_CN.UTF-8 not installed, refusing” 是最常见卡点。这不是配置写错了,而是系统压根没生成这个 locale。
CentOS 7 默认只装了 en_US.UTF-8 等基础 locale,中文支持需要额外安装语言包:
- 运行
yum install glibc-langpack-zh(不是Chinese Support组,那个在 CentOS 7 上已弃用且不生效) - 安装完成后,执行
locale -a | grep zh_CN,应能看到zh_CN.utf8(注意是小写 utf8,不是 UTF-8) - 若仍无输出,可手动生成:
localedef -f UTF-8 -i zh_CN zh_CN.utf8
/etc/locale.conf 写什么才真正生效
/etc/locale.conf 是 systemd 系统唯一认的全局 locale 配置文件,但内容格式有严格要求:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
- 只写
LANG=zh_CN.utf8就够了,LC_ALL不要写进这个文件——它会覆盖所有子 locale 设置,反而导致LC_TIME或LC_MESSAGES异常 - 必须用小写
utf8,写成UTF-8或zh_CN.UTF-8会导致locale命令报 “Cannot set LC_CTYPE…” 错误 - 不要加引号:
LANG="zh_CN.utf8"是错的,正确是LANG=zh_CN.utf8 - 改完后执行
source /etc/locale.conf只对当前 shell 临时生效;重启或重新登录才全局生效
SSH 连接后还是乱码,检查终端编码
即使系统 locale 正确,SSH 客户端若没设对编码,照样显示方块或问号:
- Xshell:右键标题栏 → “属性” → “终端” → “字符编码” → 选
UTF-8 - SecureCRT:Options → Session Options → Appearance → Character encoding →
UTF-8 - PuTTY:Window → Translation → “Received data assumed to be in which character set” →
UTF-8 - 关键点:客户端编码必须和服务器
LANG值一致,即都为utf8;混用GBK或ISO-8859-1必然乱码
locale 输出里 LC_ALL 为空,正常吗
看到 LC_ALL=(空值)不用慌,这是预期行为。只要 LANG=zh_CN.utf8 且其他 LC_* 没显式覆盖,系统就自动继承 LANG 的值。
真正要警惕的是这些现象:
-
locale命令本身报错:“Cannot set LC_CTYPE to default locale” → 说明 locale 文件未生成或路径错误 -
echo $LANG输出zh_CN.UTF-8(大写 UTF-8),但locale -a找不到对应项 → 名称不匹配 - 命令行能正常显示中文,但
vim或less里仍是乱码 → 这些工具可能读取了用户级配置(如~/.bashrc中的export LC_ALL=...),需检查并清理
locale 和 echo $LANG 对照着看两遍,再开新 terminal 验证 —— 很多“无效”其实是缓存或客户端没同步。










