debian/ubuntu 安装 fonts-wqy-zenhei 需执行 sudo apt update && sudo apt install fonts-wqy-zenhei,再运行 sudo fc-cache -fv 刷新缓存;若仍乱码,需检查 locale 是否设为 zh_cn.utf-8 并确认 fc-list :lang=zh 有输出。

Debian/Ubuntu 怎么装 fonts-wqy-zenhei 才不乱码
装了字体但终端或浏览器还是显示方块,大概率是没装对包,或者没刷新字体缓存。fonts-wqy-zenhei 是最稳妥的开源中文字体,支持 GB2312/GBK/Unicode,比 fonts-arphic-ukai 等老包兼容性好得多。
执行以下命令(注意别漏掉 sudo apt update):
sudo apt update sudo apt install fonts-wqy-zenhei
装完必须运行:
sudo fc-cache -fv
常见错误现象:fc-list :lang=zh 查不到中文字体、gedit 打开中文文件仍为方块、Firefox 新建标签页地址栏输入中文变问号。这些都不是字体“没装上”,而是缓存没刷或系统没识别到语言支持。
- 别用
apt install ttf-wqy-zenhei—— 这个包名在较新 Debian/Ubuntu 中已废弃,会提示找不到 - 如果用的是 Ubuntu 22.04+,
fonts-wqy-zenhei默认不在main源里,需确认/etc/apt/sources.list含universe仓库 -
fc-cache -fv必须加-v参数看输出,正常会有类似"/usr/share/fonts/truetype/wqy" ... done的行;如果没扫到该路径,说明安装失败或路径被改过
CentOS/RHEL 8+ 安装 google-noto-sans-cjk-ttc-fonts 的实际效果
Red Hat 系默认不带文泉驿,google-noto-sans-cjk-ttc-fonts 是更现代的选择:单个 .ttc 文件含简体、繁体、日、韩字形,体积小、渲染清晰,且对 Wayland 和 HiDPI 支持更好。
直接启用 EPEL 后安装:
sudo dnf install epel-release -y sudo dnf install google-noto-sans-cjk-ttc-fonts
不用手动 fc-cache —— DNF 安装字体包时会自动触发刷新。但要注意:
- 这个包在 RHEL 8/CentOS 8 中叫
google-noto-sans-cjk-ttc-fonts,RHEL 9+ 改名为google-noto-sans-cjk-fonts,别按旧名搜索 - 如果用 GNOME,还需确认
gsettings get org.gnome.desktop.interface font-name返回的字体名里包含Noto Sans CJK,否则 GTK 应用可能 fallback 到无中文的默认字体 - 某些 Java 应用(如 IntelliJ)会忽略系统字体配置,需在启动脚本里加
-Dawt.useSystemAAFontSettings=lcd
fc-match 显示 serif: "Nimbus Roman No9 L" 但需要中文怎么办
这说明字体匹配机制没找到可用中文字体,fc-match 默认只查 serif 类别,而中文字体常注册在 sans-serif 或 monospace 下。不是配置错了,是查的方式不对。
验证是否真有中文字体生效,用:
fc-match -s "sans-serif" | head -5
你会看到类似:
WenQuanYi Zen Hei.ttf: "WenQuanYi Zen Hei" "Regular" NotoSansCJKsc-Regular.otf: "Noto Sans CJK SC" "Regular"
如果第一行就是英文或空,才说明有问题。这时候再检查:
-
fc-list :lang=zh是否有输出 —— 没输出 = 字体没注册成功,重跑fc-cache -fv -
LANG环境变量是否设为zh_CN.UTF-8或类似值 —— 某些程序(如 Xterm)依赖它决定 fallback 字体链 -
/etc/fonts/conf.d/64-language-selector-prefer.conf是否存在且未被注释 —— 这个文件控制中文字体优先级,删了它会导致中文 fallback 到英文字体
终端里 ls 中文文件名显示为 ??? 或乱码
这不是字体问题,是 locale 没生效。字体只管“怎么画”,locale 决定“怎么读”。即使装了全套中文字体,LANG=C 也会让 ls 把 UTF-8 字节当 Latin-1 解码,结果就是 ???。
检查当前 locale:
locale
理想输出应含 LANG=zh_CN.UTF-8。如果没有,临时生效:
export LANG=zh_CN.UTF-8
永久生效要改 /etc/default/locale(Debian/Ubuntu)或 /etc/locale.conf(RHEL/CentOS),然后重新登录 SSH 或重启终端。
- 别在
~/.bashrc里写export LANG=...—— 图形界面下(如 GNOME Terminal)可能被桌面环境覆盖,优先走系统级配置 -
locale -a | grep zh_CN.utf8查不到对应 locale?运行sudo locale-gen zh_CN.UTF-8(Debian/Ubuntu)或sudo localectl set-locale LANG=zh_CN.UTF-8(RHEL/CentOS) - SSH 连接时,客户端也可能发送
LANG=C,需在本地 SSH 配置里加SendEnv LANG LC_*,服务端/etc/ssh/sshd_config加AcceptEnv LANG LC_*
字体和 locale 是两层事:一个管显示,一个管解码。搞混这两者,折腾半天也白搭。










