中文环境为什么是乱的
服务器上常见两类中文问题:终端或文件内容显示乱码,以及程序启动时报缺少语言环境的警告。根因通常是两点:系统未生成中文语言包,或者 LANG、LC_ALL 这类变量没有正确设置。桌面版安装时选了中文,服务器版通常需要手动补齐。
基本信息
| 查看现状 | locale 与 localectl status |
|---|---|
| 设置命令 | localectl set-locale LANG=zh_CN.UTF-8 |
| 配置文件 | /etc/locale.conf 与 /etc/profile.d/ |
| 关键变量 | LANG、LC_ALL、LC_CTYPE |
| 语言包 | RPM 系 glibc-langpack-zh,DEB 系 locales |
典型使用场景
- 服务器上跑的程序输出中文乱码
- 程序启动时报找不到语言环境的警告
- 图形界面下中文显示为方块
- 脚本处理中文文件名时需要正确的字符集
- 从英文环境切换到中文环境的交付场景
设置中文环境
设置中文环境
locale # 查看当前全部语言环境变量
localectl status # 查看系统级设置
localectl set-locale LANG=zh_CN.UTF-8
localectl list-locales | grep -i zh # 确认中文语言包是否存在
dnf install -y glibc-langpack-zh # RPM 系补装中文语言包
apt install -y locales && dpkg-reconfigure locales # DEB 系生成语言包
locale # 重新登录后确认生效变量优先级
| 变量 | 作用 | 优先级 |
|---|---|---|
| LC_ALL | 覆盖所有语言环境设置 | 最高 |
| LC_CTYPE | 字符分类与编码判断 | 高于 LANG |
| LC_MESSAGES | 程序提示语言 | 高于 LANG |
| LANG | 默认语言环境 | 基础设置 |
| LANGUAGE | 部分程序的提示语言列表 | 仅部分程序生效 |
排查步骤
- 先执行 locale 看有无警告与当前取值
- 确认变量是写在配置里还是临时导出
- 缺语言包时先补装再设置变量
- 检查是否存在遗留的 LC_ALL 覆盖设置
- 重新登录或用新会话验证是否生效
只 export 变量不写配置文件,换个会话就丢失;系统级设置要落到 /etc/locale.conf,用户级可写在 profile.d 下的脚本里。
相关配置位置
- 系统级语言设置:locale.conf
- 用户级设置:profile.d 下的脚本
- 服务级设置:单元文件里的环境变量
- 容器内设置:镜像自带的环境变量