Linux中文字体生效的关键是Fontconfig正确发现、索引并匹配字体,需将字体放入其扫描目录(如~/.local/share/fonts/)、设置正确权限、运行fc-cache -fv并验证输出及fc-list/fc-match结果。

Linux 设置中文字体不是“复制完字体就自动生效”,关键在于 Fontconfig 能否发现、索引并正确匹配它。多数乱码问题,根源是字体没进缓存,或路径/权限不对。
字体必须放在 Fontconfig 扫描的目录里
Fontconfig 只认几个固定路径,其他地方它根本不会看——哪怕你把 SimHei.ttf 拖进 ~/Downloads,fc-list :lang=zh 也永远查不到。
- 用户级(推荐,无需
sudo):~/.local/share/fonts/(注意:不是过时的~/.fonts/) - 系统级(所有用户可用):
/usr/share/fonts/truetype/custom/或/usr/share/fonts/opentype/(别直接塞进/usr/share/fonts/truetype/根目录,易和包管理器冲突) - 执行前先建目录:
mkdir -p ~/.local/share/fonts/zh - 再复制:
cp ~/Downloads/SimHei.ttf ~/.local/share/fonts/zh/
fc-cache -fv 必须看到你的路径才真生效
fc-cache 是个“静默跳过狂魔”:文件损坏、权限为 000、目录空、甚至文件名含中文(某些旧版 fontconfig),它都不报错,只默默跳过。
- 运行后紧盯终端输出,确认出现类似行:
/home/yourname/.local/share/fonts/zh: caching, new cache contents: 1 fonts, 0 dirs - 如果没看到你放字体的路径,说明根本没扫到——常见原因:
ls -ld ~/.local/share/fonts/zh权限不是drwxr-xr-x;ls -l ~/.local/share/fonts/zh/SimHei.ttf不是-rw-r--r--(至少 644);路径拼错,比如写成~/.local/share/font/(少了个s)
验证是否真装上了,别信“复制完成”
GUI 应用乱码、终端方块、浏览器问号,90% 是这步没做实。
- 先查缓存里有没有中文字体:
fc-list :lang=zh | grep -i "simhei\|wqy\|noto" - 再确认该字体能被匹配:
fc-match "SimHei"或fc-match sans-serif:lang=zh - 如果返回的是
DejaVuSans.ttf或其他非中文字体,说明 Fontconfig 没找到或没选中你的字体——这时要检查配置文件或语言标签是否被覆盖
最常被忽略的点:CentOS 7.9 等老系统默认不扫描 ~/.local/share/fonts/,必须手动在 ~/.config/fontconfig/fonts.conf 里加 <dir>~/.local/share/fonts</dir>,否则 fc-cache -fv 就算跑成功了,也白搭。


















