在 Linux 桌面环境中,字体显示异常有时并不是某一个软件本身的问题,而是系统字体目录、fontconfig 缓存、默认字体匹配顺序、位图字体配置等多个因素共同造成的。本文记录一次字体系统整理过程:在确认异常字体残留已经清除后,对本地手动安装字体进行分类整理,并清理 fontconfig 缓存,使字体系统恢复到比较干净、可维护的状态。

一、确认本地字体目录现状

首先查看 /usr/local/share/fonts 下手动安装的字体文件:

find /usr/local/share/fonts -maxdepth 2 -type f \
  \( -iname "*.ttf" -o -iname "*.otf" -o -iname "*.ttc" \) \
  -print

最初的目录结构比较临时化,例如:

/usr/local/share/fonts/u/
/usr/local/share/fonts/微/
/usr/local/share/fonts/s/
/usr/local/share/fonts/t/
/usr/local/share/fonts/f/

这些目录本身并不会导致字体异常,但从长期维护角度看,可读性较差。进一步使用 fc-scan 查看字体实际识别情况:

find /usr/local/share/fonts -type f \
  \( -iname "*.ttf" -o -iname "*.otf" -o -iname "*.ttc" \) \
  -print0 | xargs -0 fc-scan --format '%{family} | %{file}\n'

扫描结果显示,这些字体主要包括:

Ubuntu / Ubuntu Mono
Microsoft YaHei / 微软雅黑
SimHei / 黑体
SimSun-ExtB
STSong / 华文宋体
STKaiti / 华文楷体
Times New Roman
FZYaoTi / 方正姚体
FZShuTi / 方正舒体

也就是说,这些并不是未知字体或远程控制软件残留字体,而是手动安装的 Ubuntu、微软雅黑、Windows 中文字体、Times New Roman 和方正字体等。

二、检查位图字体配置

继续检查 fontconfig 中与 bitmap font 相关的配置:

ls /etc/fonts/conf.d | grep -i bitmap

最初只看到:

10-scale-bitmap-fonts.conf

这并不是禁用位图字体,而是和位图字体缩放有关的配置。系统中同时存在 /usr/share/fonts/100dpi/usr/share/fonts/75dpi 这类老式 X11 位图字体目录。现代桌面环境、浏览器、GTK、Qt、Electron 应用通常不需要它们参与字体匹配。

因此后续启用了:

sudo ln -sf /usr/share/fontconfig/conf.avail/70-no-bitmaps.conf /etc/fonts/conf.d/70-no-bitmaps.conf

启用后再次检查:

ls /etc/fonts/conf.d | grep -i bitmap

结果变为:

10-scale-bitmap-fonts.conf
70-no-bitmaps.conf

这表示禁用位图字体的配置已经生效,可以减少老式位图字体干扰现代桌面显示的可能性。

三、整理本地字体目录结构

为了让字体目录更自然、长期可维护,将原来的临时目录名整理成更清楚的分类目录。

创建新目录:

sudo mkdir -p /usr/local/share/fonts/ubuntu
sudo mkdir -p /usr/local/share/fonts/microsoft-yahei
sudo mkdir -p /usr/local/share/fonts/windows-cjk
sudo mkdir -p /usr/local/share/fonts/times-new-roman
sudo mkdir -p /usr/local/share/fonts/fangzheng

移动字体文件:

sudo mv /usr/local/share/fonts/u/*.ttf /usr/local/share/fonts/ubuntu/
sudo mv /usr/local/share/fonts/微/*.ttc /usr/local/share/fonts/microsoft-yahei/
sudo mv /usr/local/share/fonts/s/*.ttf /usr/local/share/fonts/windows-cjk/
sudo mv /usr/local/share/fonts/t/*.ttf /usr/local/share/fonts/times-new-roman/
sudo mv /usr/local/share/fonts/f/*.ttf /usr/local/share/fonts/fangzheng/

删除空目录:

sudo rmdir /usr/local/share/fonts/u
sudo rmdir /usr/local/share/fonts/微
sudo rmdir /usr/local/share/fonts/s
sudo rmdir /usr/local/share/fonts/t
sudo rmdir /usr/local/share/fonts/f

整理后,本地字体目录结构变为:

/usr/local/share/fonts/ubuntu/
/usr/local/share/fonts/microsoft-yahei/
/usr/local/share/fonts/windows-cjk/
/usr/local/share/fonts/times-new-roman/
/usr/local/share/fonts/fangzheng/

这样的结构比单字母目录更清晰:

ubuntu              # Ubuntu / Ubuntu Mono
microsoft-yahei     # 微软雅黑
windows-cjk         # Windows 中文字体、华文字体等
times-new-roman     # Times New Roman
fangzheng           # 方正字体

四、刷新 fontconfig 缓存

移动字体后,需要重建字体缓存:

sudo fc-cache -frv
fc-cache -frv

在 verbose 输出中,可以看到新目录已经被识别:

/usr/local/share/fonts/fangzheng: caching, new cache contents: 2 fonts, 0 dirs
/usr/local/share/fonts/microsoft-yahei: caching, new cache contents: 6 fonts, 0 dirs
/usr/local/share/fonts/times-new-roman: caching, new cache contents: 4 fonts, 0 dirs
/usr/local/share/fonts/ubuntu: caching, new cache contents: 14 fonts, 0 dirs
/usr/local/share/fonts/windows-cjk: caching, new cache contents: 15 fonts, 0 dirs

这说明 fontconfig 已经识别新的字体路径。

五、处理 fontconfig 缓存中的无效文件

在重建缓存过程中,出现过类似信息:

/var/cache/fontconfig: invalid cache file: xxxxx-le64.cache-9
/home/user/.cache/fontconfig: invalid cache file: xxxxx-le64.cache-9

这类信息表示旧缓存文件已经无效。字体文件移动后,缓存路径和内容发生变化,出现旧缓存无效并不奇怪。

处理方式是直接清理系统缓存和用户缓存:

sudo rm -f /var/cache/fontconfig/*
rm -rf ~/.cache/fontconfig/*
sudo fc-cache -fr
fc-cache -fr

然后使用关键词过滤检查是否还有真正错误:

fc-cache -frv 2>&1 | grep -Ei 'invalid|error|failed|cannot|permission'

如果没有任何输出,说明真正需要处理的错误已经清理干净。

六、确认字体仍能正常匹配

最后检查常用字体是否仍能被 fontconfig 正确识别:

fc-match "Microsoft YaHei"
fc-match "Times New Roman"
fc-match "Ubuntu"
fc-match "SimHei"
fc-match sans-serif:lang=zh-cn
fc-match sans-serif:lang=ja

结果类似:

微软雅黑.ttc: "Microsoft YaHei" "Regular"
times.ttf: "Times New Roman" "Regular"
Ubuntu_R.ttf: "Ubuntu" "Regular"
simhei.ttf: "SimHei" "Regular"
NotoSansCJK-Regular.ttc: "Noto Sans CJK SC" "Regular"
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"

这个结果比较理想:

  • Microsoft YaHei 可以正常识别;
  • Times New Roman 可以正常识别;
  • Ubuntu 可以正常识别;
  • SimHei 可以正常识别;
  • 简体中文默认 sans-serif 走 Noto Sans CJK SC
  • 日文默认 sans-serif 走 Noto Sans CJK JP

这说明移动路径并没有破坏字体识别。系统默认中日文字体仍然使用 Linux 下较稳定的 Noto CJK,而网页或应用如果显式指定微软雅黑,也可以正常调用本地安装的 Microsoft YaHei。

七、哪些输出不需要过度处理

fc-cache -frv 的完整日志中,可能还能看到一些看起来像异常的信息,例如:

skipping, no such directory
looped directory detected
not cleaning unwritable cache directory

这些不一定是真正错误。

skipping, no such directory

例如:

/home/user/.fonts: skipping, no such directory
/home/user/.local/share/fonts: skipping, no such directory

这只是表示对应用户字体目录不存在。若需要让日志更干净,可以创建:

mkdir -p ~/.local/share/fonts
mkdir -p ~/.fonts

但不创建也不会影响系统字体使用。

not cleaning unwritable cache directory

普通用户执行 fc-cache 时,可能看到:

/var/cache/fontconfig: not cleaning unwritable cache directory

这是因为普通用户没有权限清理系统缓存。正确做法不是修改目录权限,而是分别执行:

sudo fc-cache -fr
fc-cache -fr

系统缓存交给 root 权限处理,用户缓存交给普通用户处理。

looped directory detected

例如:

/usr/local/share/fonts/microsoft-yahei: skipping, looped directory detected

这类信息在 verbose 模式下可能出现。通常不是字体目录真的出现循环,也不一定代表故障。相比盯着完整 verbose 日志,更有效的方法是用关键词过滤真正错误:

fc-cache -frv 2>&1 | grep -Ei 'invalid|error|failed|cannot|permission'

如果这条命令没有输出,就可以认为 fontconfig 没有明显错误。

八、整理后的状态

最终完成了几件事:

  1. 本地字体目录从临时命名整理为清晰分类;
  2. 手动安装的字体全部保留,没有删除;
  3. fontconfig 缓存中的无效文件已经清理;
  4. 位图字体禁用配置已经启用;
  5. 常用字体匹配正常;
  6. 中文和日文默认 fallback 都回到 Noto CJK;
  7. 微软雅黑、Times New Roman、Ubuntu、黑体等字体仍可正常调用。

整理后的字体系统适合长期使用。
如果系统界面、浏览器网页、中文和日文显示都已经正常,就没有必要继续大规模调整字体。字体系统的维护重点应该转向稳定,而不是继续反复清理。

Leave a Reply

Your email address will not be published. Required fields are marked *