确认系统是否已生成zh_cn.utf-8:运行locale -a | grep -i "zh_cn",若无输出则说明未生成;debian/ubuntu执行sudo dpkg-reconfigure locales并选中该locale,rhel/centos 8+安装glibc-langpack-zh,arch需取消/etc/locale.gen中对应行注释后运行sudo locale-gen。

确认系统是否已生成 zh_CN.UTF-8
直接设 LANG=zh_CN.UTF-8 却报 cannot change locale,八成是系统压根没生成这个 locale。这不是配置问题,是“有无”的问题。
- 运行
locale -a | grep -i "zh_cn",看输出里有没有zh_CN.UTF-8(注意大小写和点号:zh_CN.utf8≠zh_CN.UTF-8,现代发行版默认要求大写UTF-8) - 若无输出:
- Debian/Ubuntu:
sudo dpkg-reconfigure locales,空格选中zh_CN.UTF-8,按OK - RHEL/CentOS 8+:
sudo dnf install glibc-langpack-zh - Arch Linux:编辑
/etc/locale.gen,取消注释zh_CN.UTF-8 UTF-8行,再执行sudo locale-gen
- Debian/Ubuntu:
永久设置 LANG 要写对配置文件路径
写错路径等于白改,而且不会报错——系统安静地读取了错误的文件,或者根本没读。
- Debian/Ubuntu:
/etc/default/locale,内容为LANG="zh_CN.UTF-8"(带双引号) - RHEL/CentOS 7+/Fedora/Arch:
sudo localectl set-locale LANG=zh_CN.UTF-8(无引号,它会自动写入/etc/locale.conf) - RHEL 6 或更老系统:
/etc/sysconfig/i18n,格式同上,但拼错路径(比如/etc/syscnfig/i18n)很常见 - 桌面环境(GNOME/KDE)会缓存旧设置,改完必须登出重进,不能只重启终端
检查或清空 LC_ALL,否则 LANG 形同虚设
LC_ALL 是最高优先级的 locale 变量,只要它非空,LANG 和所有 LC_* 全部失效。这是切中文后仍显示英文、或切英文后仍乱码的最隐蔽原因。
- 运行
locale,如果LC_ALL有值(如LC_ALL=POSIX),说明它正在强制覆盖 - 临时解决:
unset LC_ALL或export LC_ALL=zh_CN.UTF-8(保持统一) - 永久清理:检查
/etc/environment、/etc/profile.d/*.sh、~/.bashrc、~/.profile,删掉或注释掉export LC_ALL=...这类行 - SSH 登录时客户端可能通过
AcceptEnv LANG LC_*把旧值带进来,可临时在服务端/etc/ssh/sshd_config中注释该行并sudo systemctl restart sshd
终端和字体不支持 UTF-8,locale 再对也白搭
即使 locale 全绿、echo "你好" 正常返回,图形界面菜单或终端里仍是方块——说明终端模拟器没用 UTF-8 编码渲染,或系统没装中文字体。
- 终端设置里确认编码为
UTF-8(GNOME Terminal、Konsole、xterm 等都有对应选项) - 命令行下测试:
echo -e '\xe4\xbd\xa0\xe5\xa5\xbd'(UTF-8 编码的“你好”),若显示方块,说明终端或字体链断了 - GUI 环境需安装中文字体,例如 Ubuntu:
sudo apt install fonts-wqy-microhei;CentOS:sudo yum install wqy-microhei-fonts - 某些最小化安装的服务器(如 Docker 镜像、云主机)默认不带 GUI 字体,仅靠
locale设置无法让 GUI 应用显示中文
LC_ALL 在暗处作祟、终端编码不对、字体缺失——四个环节里只要一个没对上,中文就出不来。尤其要注意 LC_ALL 的静默覆盖行为和终端本身的编码设置,这两处最容易被当成“已配置成功”而跳过排查。











