中文乱码核心是locale未启用或不匹配,字体仅为渲染环节。先运行locale确认lang为zh_cn.utf-8,再查locale -a | grep zh_cn.utf-8是否输出;若无,需依发行版生成locale,之后配置字体与终端utf-8编码。

中文乱码不是“装个字体就能好”的问题,核心是 locale 没启用或不匹配,字体只是后续渲染环节。先确认 LANG 是 zh_CN.UTF-8,再谈字体、终端、SSH。
检查并启用 zh_CN.UTF-8 locale
乱码的第一道关卡永远是 locale。运行 locale,如果 LANG 显示为 C、POSIX 或空,那系统压根不会尝试解析中文——字体再全也白搭。
- 查是否已生成:运行
locale -a | grep zh_CN.UTF-8,无输出说明未启用 - Ubuntu/Debian:取消
/etc/locale.gen中zh_CN.UTF-8 UTF-8的注释,再执行sudo locale-gen - RHEL/CentOS/Rocky:用
sudo localectl set-locale LANG=zh_CN.UTF-8(自动触发生成) - Arch:编辑
/etc/locale.gen后运行sudo locale-gen,再写入LANG=zh_CN.UTF-8到/etc/locale.conf - 临时测试:直接运行
export LANG=zh_CN.UTF-8,然后echo "你好"看是否正常
安装中文字体并刷新 fontconfig 缓存
locale 正确后仍显示方块,说明终端或 GUI 应用找不到可用中文字体。Fontconfig 不会自动扫描任意目录,必须把字体放对位置并显式刷新缓存。
- 用户级推荐路径:
~/.local/share/fonts/zh/(不用 sudo,权限天然正确) - 全局路径(需 sudo):
/usr/share/fonts/opentype/noto/或新建子目录如/usr/share/fonts/wnr/ - 别用
~/.fonts/:该路径已弃用,新版本 fontconfig 默认不扫描 - 安装包优先选:
fonts-wqy-zenhei(Debian/Ubuntu)、google-noto-sans-cjk-ttc-fonts(RHEL 8+)、noto-fonts-cjk(Arch) - 装完必须运行:
sudo fc-cache -fv(加-v才能看到是否扫到了你的字体目录) - 验证是否生效:
fc-list :lang=zh应有输出;fc-match sans-serif应返回含 “Noto” 或 “WenQuanYi” 的字体名
终端和 SSH 连接中的中文显示修复
即使 locale 和字体都对了,GNOME Terminal、xterm 或 SSH 登录后仍可能乱码,因为它们各自有编码和字体配置逻辑。
- GNOME Terminal:设置 → 当前配置文件 → 字体 → 取消勾选“使用系统等宽字体”,手动选
Noto Sans CJK SC或WenQuanYi Micro Hei - xterm / rxvt:在
~/.Xresources中指定 fallback 字体,例如:XTerm*faceNameDoublesize: WenQuanYi Micro Hei - SSH 客户端乱码:本地
~/.ssh/config加SendEnv LANG LC_*,服务端/etc/ssh/sshd_config加AcceptEnv LANG LC_*,再sudo systemctl restart sshd - 确保终端本身编码设为 UTF-8:GNOME Terminal 菜单栏 Terminal → Set Character Encoding → Unicode (UTF-8)
桌面应用(Firefox、VS Code、Java IDE)不显示中文
这些程序不读 LANG,而是依赖 Fontconfig 匹配和 GTK/Qt 的 IM 模块。locale 对它们只是间接影响。
- GTK 应用(如 Firefox、gedit):运行
gsettings get org.gnome.desktop.interface font-name,返回字体名里应含 “Noto Sans CJK” - Qt 应用(如 Qt Creator):需确保
QT_IM_MODULE=fcitx且已安装fcitx-frontend-qt5 - Java 应用(如 IntelliJ):常忽略系统设置,启动脚本里加 JVM 参数:
-Dawt.useSystemAAFontSettings=lcd - 若
fc-match sans-serif返回的是英文默认字体(如 “Nimbus Sans”),说明中文字体没被 Fontconfig 正确注册,回看上一步缓存是否真刷进去了
最易被忽略的点是:locale 配置文件位置因发行版而异(/etc/default/locale vs /etc/locale.conf),而 fc-cache -fv 的输出必须人工核对是否包含了你放字体的路径——它失败时从不报错,只沉默跳过。











