LANG和LC_ALL设为zh_CN.UTF-8可解决多数中文乱码,但须先确认系统已生成该locale,否则配置无效;需运行locale -a | grep zh_CN.utf8验证,若无输出则需用localedef生成,并正确配置/etc/locale.conf及终端UTF-8编码。

LANG 和 LC_ALL 设为 zh_CN.UTF-8 就能解决绝大多数中文乱码问题,但必须确认系统已生成该 locale,否则改了配置也无效。
检查系统是否支持 zh_CN.UTF-8
直接运行 locale -a | grep zh_CN.utf8。如果没输出,说明这个 locale 还没生成,硬写进 /etc/locale.conf 是没用的。
常见错误现象:改完 /etc/locale.conf 后 locale 命令仍显示 POSIX 或空值,echo $LANG 也不生效。
- 先安装中文语言包:
yum -y groupinstall "Chinese Support" - 再生成 locale:
localedef -f UTF-8 -i zh_CN zh_CN.UTF-8 - 验证是否成功:
locale -a | grep 'zh_CN\.utf8'(注意点号要转义)
永久设置系统默认编码用 /etc/locale.conf
CentOS 7 不再读 /etc/sysconfig/i18n,只认 /etc/locale.conf。这个文件是 systemd 在 early boot 阶段加载的,影响所有服务和登录会话。
编辑它:sudo vi /etc/locale.conf,内容只需一行:
LANG="zh_CN.UTF-8"
不建议写 LC_ALL="zh_CN.UTF-8" —— 它会强制覆盖所有 locale 类别,可能干扰某些依赖英文排序或数字格式的程序(比如数据库导入、日志解析脚本)。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
-
LANG是兜底值,各LC_*变量未显式设置时才继承它 - 改完不用重启,新登录的用户/TTY/SSH 会话立即生效
- 已有终端会话需重新登录,
source /etc/locale.conf对当前 shell 无效
终端模拟器也要配 UTF-8 编码
即使系统 locale 正确,XShell、SecureCRT、PuTTY 或 GNOME Terminal 自身若设成 GBK 或 ISO-8859-1,照样显示方块或问号。
关键不是“系统编码”,而是“终端声称自己能解码什么”——两者必须一致。
- XShell:右键标题栏 → “属性” → “终端” → “字符编码” → 选
UTF-8 - SecureCRT:选项 → 会话选项 → 外观 → 字符编码 →
UTF-8 - GNOME Terminal(GUI):编辑 → 首选项 → 当前配置文件 → 兼容性 → 字符编码 →
UTF-8
漏掉这步,ls 出中文文件名还是乱码,vim 里粘贴中文也会变形。
localectl 命令只是 wrapper,不能替代手动配置
localectl set-locale LANG=zh_CN.UTF-8 看似方便,但它底层仍是写 /etc/locale.conf,且不会帮你生成缺失的 locale。
更麻烦的是:它不校验输入值是否真实存在。比如误敲成 zh_CN.UTF8(少个短横),命令执行成功,但后续 locale 显示全 POSIX,排查起来反而多绕一圈。
- 优先手写
/etc/locale.conf,可控性强 -
localectl status只用来验证结果,别当配置入口 -
localectl list-locales | grep zh_CN可快速列出已生成的中文 locale
LANG=... 却不生效”,其实只是 localedef 没跑过。

















