需先安装glibc-langpack-zh包并执行localedef生成zh_CN.UTF-8,再正确配置/etc/locale.conf为LANG=zh_CN.UTF-8,最后确保终端SSH客户端编码设为UTF-8。

检查当前 locale 是否支持 zh_CN.UTF-8
很多用户直接改 /etc/locale.conf 却发现中文仍乱码,根本原因是系统压根没生成过 zh_CN.UTF-8 这个 locale。执行 locale -a | grep zh_CN.utf8,如果无输出,说明语言包未安装或 locale 未生成。
常见错误现象:localectl set-locale LANG=zh_CN.UTF-8 报错 Failed to issue method call: Locale zh_CN.UTF-8 not installed, refusing.
- 先确认是否已安装中文语言包:
yum list installed | grep glibc-langpack-zh(CentOS 7.6+ 推荐用这个包,比Chinese Support组更轻量、更精准) - 若未安装,运行:
yum install -y glibc-langpack-zh - 安装后仍不显示
zh_CN.UTF-8?补执行:localedef -f UTF-8 -i zh_CN zh_CN.UTF-8 - 验证是否生效:
locale -a | grep zh_CN.utf8应输出zh_CN.utf8
正确设置系统默认 locale(永久生效)
只改 /etc/locale.conf 是标准做法,但必须确保写法规范——大小写、下划线、点号都不能错,且不要加引号(systemd 解析时会出问题)。
错误写法示例:LANG="zh_CN.UTF-8" 或 LANG=zh_CN.utf8(小写 utf8 不被识别)
- 编辑配置文件:
sudo vi /etc/locale.conf - 写入且仅写入这一行:
LANG=zh_CN.UTF-8(注意:是UTF-8,不是utf8;不加引号;不写LC_ALL) - 立即生效:
source /etc/locale.conf - 验证:
locale输出中LANG和所有LC_*项应为zh_CN.UTF-8,LC_ALL保持为空(留空才表示继承LANG)
终端和 SSH 客户端必须同步设为 UTF-8
即使系统 locale 正确,终端或 SSH 工具用 GBK/ISO-8859-1 编码连接,照样显示方块或问号。这不是系统问题,是通信链路两端编码不匹配。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
常见错误现象:命令行里 ls 出中文文件名是乱码,但 echo "测试" 能正常显示——说明 shell 环境 OK,只是终端解码错了。
- Xshell / SecureCRT:在会话属性 → 字符编码 → 选
UTF-8 - PuTTY:窗口 → 外观 → 字符集 → 选
UTF-8 - GNOME Terminal(图形界面):编辑 → 首选项 → 当前配置文件 → 兼容性 → 字符编码 →
UTF-8 - SSH 命令行连接时加参数强制编码:
ssh -o 'SendEnv=LANG' user@host(需服务端/etc/ssh/sshd_config含AcceptEnv LANG LC_*)
TTY(Ctrl+Alt+F2~F6)中文显示仍乱码怎么办
字符控制台(非图形终端)默认不加载中文字体,即使 locale 正确,也会 fallback 到 ASCII 字形,导致中文显示为空格或方框。
这不是 locale 设置问题,是字体渲染缺失。解决路径有限,且效果不如 GUI 终端稳定:
- 安装文泉驿等位图字体:
yum install -y wqy-fonts - 临时启用 fbterm(需额外安装):
yum install -y fbterm,然后在 TTY 下运行fbterm启动带中文支持的伪终端 - 更实际的做法:接受 TTY 不显示中文的事实,专注用 SSH + 图形终端或 VS Code Remote 连接,把 TTY 留给纯英文运维操作
真正容易被忽略的是:locale 生效依赖完整链条——语言包安装 → locale 生成 → 配置文件写对 → 终端编码匹配 → (可选)字体支持。少一环,中文就断在某处。别只盯着 /etc/locale.conf 改来改去。

















