ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu下WPS字体模糊加粗?详解fontconfig配置与字体替换修复方案

Ubuntu下WPS字体模糊加粗?详解fontconfig配置与字体替换修复方案

打开 WPS 加载一个带样式排版的 docx 文档,正文里的宋体小四直接糊成一团,标题字像是被加了一圈黑边,笔画粗得有点吓人。这个场景在 Ubuntu 上装 WPS 的用户里几乎是一碰一个准,尤其刚装完系统、没装额外字体的时候,症状只会更夸张。核心原因不复杂:系统里根本没有 WPS 依赖的那套中文字体,字体渲染的 Hinting 和次像素配置又是默认值,两个因素叠在一起,就表现成了“异常加粗 + 模糊”。这篇文章把我从诊断到修复的完整排查思路、命令和配置文件都复盘一遍,顺便把中间踩过的坑也讲清楚,照着做基本能一次解决问题。

1. 先搞清楚:字体为什么会在 Ubuntu 下“发胖”和“发虚”

1.1 字体缺失触发回退匹配

WPS 在 Linux 下虽然自带了一部分字体配置,但它内部引用最多的还是 Windows 体系的那几个字体名,比如宋体(SimSun)、微软雅黑(Microsoft YaHei)、Times New Roman。Ubuntu 默认环境下这些字体一个都没有,此时系统会按 fontconfig 的规则依次回退到其他已安装字体。

回退顺序并不是“随便挑一个”,而是有一套优先级逻辑,一般倾向于选择覆盖中文能力较好、权重合适、风格相近的字体。问题是,Linux 发行版默认带的中文字体往往覆盖不全,而且不同发行版的默认字体集合差异很大。常见的回退结果要么命中了某个偏粗的字体(比如框架自动选择了 Bold 变体),要么命中了一个字重标记异常的开源字体,最终呈现出来的效果就是笔画明显加粗、字形发闷。

如果在终端里用fc-match检查,会发现 WPS 请求的家族名和最终匹配到的家族名根本不是一回事。这就是“字体异常加粗”的根源:不是 WPS 自己故意把字加粗,而是它根本找不到原来的字体,系统替它找了一个“替身”,替身长得有点壮。

1.2 Hinting 与次像素渲染:模糊的另一个元凶

加粗的问题说完了,再说模糊。字体显示模糊通常和三个参数有关:抗锯齿(antialiasing)、字体微调(hinting)和次像素渲染(subpixel rendering,比如 LCD 屏幕的 RGB 排列)。

  • 抗锯齿关掉:字体边缘全是锯齿,肉眼看着“发毛”。
  • 抗锯齿开但 Hinting 强度不对:笔画边缘被过度修正,小字号下字形轮廓被推来推去,看起来糊。
  • 次像素渲染没开或者孔径方向不对:文字出现彩色边,或者整个字形灰度发灰,观感上就是不干净。

WPS 在 Linux 下是典型的 Qt 应用,它的字体渲染最终会落到系统 fontconfig 和 Xft 配置上。Ubuntu 某些版本默认的字体配置为了通用性,把 Hinting 强度设得偏保守,或者没有针对 LCD 屏幕启用 RGB 次像素渲染。对浏览器、编辑器这类对字体显示宽容度高的软件可能还好,但对 WPS 这种需要长时间密集阅读文字、又依赖传统中文字体排版习惯的软件来说,任何一个渲染参数不到位,模糊感就会被放大。

所以完整的修复思路必须两条腿走路:一是把字体缺口补上,让 WPS 能找到合适的“原配”;二是把系统字体渲染参数调对,避免“模糊 + 加粗”这两个症状互相叠加。

2. 动手之前,先给系统做一次字体体检

2.1 用 fc-match 查看 WPS 的字体命中情况

字体配置是全局状态,盲改容易改坏,所以先别急着装字体、改配置。第一步是搞清楚系统现在到底缺什么,WPS 实际会用什么字体渲染。

打开终端,直接跑这几条命令:

fc-match SimSun fc-match "Microsoft YaHei" fc-match "Times New Roman" fc-match "WenQuanYi Micro Hei"

看返回结果的第二列。如果返回的是SimSun.ttf或者msyh.ttf这种本尊字体,说明系统里已经有对应字体,问题可能出在别的环节;如果返回的是Noto Sans CJK SC、WenQuanYi Micro Hei之类的名字,说明 WPS 请求的字体不存在,系统已经做了回退匹配。

我当时的检查结果是这样的:

$ fc-match SimSun NotoSansCJK-Regular.ttc: "Noto Sans CJK SC" "Regular"

SimSun 直接回退到了 Noto Sans CJK SC,而不是另一个中文字体。这个结果本身不算异常,但如果你平时用惯了宋体,会发现用 Noto Sans 渲染出来的文档,标题和正文的字重感跟 Windows 下差别很大。更麻烦的是,当 WPS 排版时使用了“宋体 + Bold”这种组合,fontconfig 回退后如果找不到合适的 Bold 变体,就会触发合成粗体(synthetic bold),于是笔画整整齐齐地加粗一圈。

2.2 列出缺失字体清单

接着把系统所有支持中文的字体拉出来看看:

fc-list :lang=zh family | sort -u

这个命令会列出所有带中文覆盖的字体家族。正常安装完基础字体后,应该能看到:

Noto Sans CJK HK Noto Sans CJK JP Noto Sans CJK KR Noto Sans CJK SC Noto Sans CJK TC Noto Serif CJK SC WenQuanYi Micro Hei WenQuanYi Zen Hei

如果没有Noto Serif CJK SC,说明系统中文字体里根本没有宋体类衬线字体,WPS 里凡是用“宋体”“仿宋”“楷体”排版的文档,全部会回退到黑体类无衬线字体,观感自然会“全军覆没式”地变粗。这一步检查的目的是确立修复的优先级:先补衬线字体和中文字体,再调渲染参数。

2.3 顺手检查 WPS 的字体缓存文件

WPS 在第一次启动时会把系统中可用字体扫描进自己的缓存,位置一般在用户目录下:

find ~ -maxdepth 3 -type d \( -iname "*kingsoft*" -o -iname "*wps*" \) 2>/dev/null find ~ -iname "*.dir" -path "*font*" 2>/dev/null

检查结果不重要,重要的是知道这个缓存目录存在。因为后续我们装完新字体后,如果 WPS 还显示旧字体效果,很可能就是它还在用旧的字体扫描结果,手动删掉缓存目录让 WPS 重新扫描是常见的修复动作。

3. 第一剂药:安装字体与替换规则

3.1 安装必要的开源中文字体

Ubuntu 上最稳妥的做法是安装 Noto CJK 系列和文泉驿系列,两者覆盖的场景不同:

sudo apt update sudo apt install fonts-noto-cjk fonts-noto-cjk-extra fonts-wqy-microhei fonts-wqy-zenhei
  • fonts-noto-cjk:Google 和 Adobe 合作的思源黑体系列,字重覆盖全,有 Regular、Medium、Bold、Black,很适合作为替代微软雅黑和黑体的首选。
  • fonts-noto-cjk-extra:补充更多字重和字符集,尤其适合处理繁体、生僻字场景。
  • fonts-wqy-microhei:文泉驿微米黑,身形比较细,字号小的时候比 Noto 更轻巧。
  • fonts-wqy-zenhei:文泉驿正黑,在低分辨率下表现相对稳定,适合老设备。

装完以后立刻跑一次缓存刷新:

fc-cache -fv

这一步是很多新手容易漏掉的。字体文件放进系统后,fontconfig 并不会自动发现它们,必须先刷新字体缓存,否则下一步的匹配测试仍然会显示旧结果。

3.2 添加字体替换规则,把 SimSun 映射到合适字体

安装字体只是第一步,WPS 请求的家族名还是SimSun、Microsoft YaHei这些。即使系统有了 Noto,fontconfig 的默认回退仍然可能优先匹配到 Noto Sans,而不是我们想要的宋体类字体。

此时需要手动加一条 alias 配置。在用户目录下创建或编辑配置文件:

mkdir -p ~/.config/fontconfig vim ~/.config/fontconfig/fonts.conf

推荐优先使用用户级配置,这样只影响当前用户,不会动系统全局配置,回滚也方便。

写入以下内容并保存:

<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <alias> <family>SimSun</family> <prefer> <family>Noto Serif CJK SC</family> </prefer> </alias> <alias> <family>Microsoft YaHei</family> <prefer> <family>Noto Sans CJK SC</family> </prefer> </alias> <alias> <family>宋体</family> <prefer> <family>Noto Serif CJK SC</family> </prefer> </alias> <alias> <family>黑体</family> <prefer> <family>Noto Sans CJK SC</family> </prefer> </alias> </fontconfig>

这段配置的意思很直白:当程序请求SimSun时,优先使用Noto Serif CJK SC;请求Microsoft YaHei时,优先使用Noto Sans CJK SC。

注意我这里把“宋体”“黑体”这两个中文别名也加了进去。WPS 在某些版本里,内部字体名用的是中文字面而不是英文家族名,不加这一条,中文字面还是会回退到默认字体。

保存后刷新缓存,再验证一次:

fc-cache -fv fc-match SimSun

此时如果输出变成:

NotoSerifCJK-Regular.ttc: "Noto Serif CJK SC" "Regular"

说明替换规则生效了。到了这一步,“WPS 里用宋体排版的正文”基本不会再出现把自己渲染成黑体加粗的情况。

3.3 为什么不建议直接拷贝微软字体

很多教程会推荐直接把 Windows 下的simsun.ttc、msyh.ttf拷贝到 Linux 的字体目录里,一劳永逸。从技术上说,这确实是最省事、版面还原度最高的方案,WPS 直接找到了“原配”,几乎不需要任何配置。

但我个人不太建议作为首选方案,原因有两点。一是字体文件体积不小,宋体加雅黑加起来超过几十兆,为了实现几个字体名去承担这份开销有点不值。二是字体替换规则维护上更灵活,你随时可以换一个更顺眼的开源字体,而直接拷贝字体等于把显示效果焊死在某个闭源字体上,后续字体渲染如果出现兼容问题,排查成本更高。

如果确实因为工作对接需要,必须让所有机器上的字体观感完全一致,再考虑拷贝字体。做法是先创建用户字体目录,把字体文件放进去,刷新缓存:

mkdir -p ~/.local/share/fonts cp simsun.ttc msyh.ttf ~/.local/share/fonts/ fc-cache -fv

这种方式放在最后作为备选,而不是一开始就上。

3.4 别忘了楷体、仿宋和等线

公文类文档除了宋体和黑体,还会用到楷体(KaiTi)、仿宋(FangSong)、等线(DengXian)这些字体。Noto CJK 系列里没有仿宋和楷体,需要单独安装开源替代品:

sudo apt install fonts-cns11643-kai fonts-cns11643-sung

或者安装国内社区打包的仿宋楷体开源替代包,具体包名因 Ubuntu 版本而异,可以通过apt search kai、apt search fangsong查找。没有这些字体时,WPS 回退的表现会非常夸张,整页看起来像全是加粗黑体,装了之后至少字面轮廓不那么突兀。

4. 第二剂药:渲染参数调优,把模糊压下去

4.1 全局字体渲染配置怎么改才不伤其他软件

字体装好了、替换也生效了,但模糊这个症状往往还在。原因是 Ubuntu 默认字体渲染配置为了兼容性,把次像素渲染和微调强度设置得比较保守。可以在用户级字体配置里增加更精细的渲染参数。

编辑刚才那个~/.config/fontconfig/fonts.conf,在fontconfig根元素内追加:

<match target="font"> <edit name="antialias" mode="assign"><bool>true</bool></edit> <edit name="hinting" mode="assign"><bool>true</bool></edit> <edit name="hintstyle" mode="assign"><const>hintslight</const></edit> <edit name="rgba" mode="assign"><const>rgb</const></edit> <edit name="lcdfilter" mode="assign"><const>lcddefault</const></edit> </match>

逐个说下这些参数的含义:

  • antialias=true:抗锯齿必须开,关掉之后字体全是锯齿,模糊问题只会更严重。
  • hinting=true:开启字体微调。微调的作用是让字形贴合像素网格,让小字号文字更锐利。
  • hintstyle=hintslight:微调强度选择轻微。这是最关键的一项。如果你把 hintstyle 设成hintfull或者hintmedium,低分辨率下中文笔画会被强制修正,直接表现为“糊 + 粗”。hintslight在清晰度和字形形状之间取得平衡,适合现在的 LCD 屏幕。
  • rgba=rgb:次像素渲染孔径方向。绝大多数 LCD 屏幕像素排列是 RGB,如果屏幕实际是 BGR 或者没开这项,文字边缘会出现彩色镶边,观感模糊。
  • lcdfilter=lcddefault:LCD 过滤器,配合次像素渲染使用,进一步减少彩色边现象。

这段配置是全局生效的,意味着对系统所有软件生效。但不用担心会影响浏览器的观感,现代浏览器和桌面环境默认的字体配置基本也是这一套,而且比这个更激进。实际测试下来,这套参数对大多数软件都是正向优化。

4.2 针对 WPS 进程的定向优化

全局配置有一定风险,因为某些老旧的 Qt 应用可能对rgba的响应很怪。我比较推荐再加一道保险:针对 WPS 进程单独设置环境变量。

WPS 在 Linux 下本质是 Qt 应用,可以通过QT_SCALE_FACTOR和QT_AUTO_SCREEN_SCALE_FACTOR控制高分屏下的缩放,避免 UI 本身模糊。建议创建一个小启动脚本,或者修改 WPS 的桌面启动条目:

env QT_AUTO_SCREEN_SCALE_FACTOR=1 QT_ENABLE_HIGHDPI_SCALING=1 wps

如果是在高分辨率屏幕上字体偏小、发虚,可以再追加:

env QT_AUTO_SCREEN_SCALE_FACTOR=1 QT_SCALE_FACTOR=1.25 wps

这个数值要按显示器实际缩放比例调整,比如 125% 的 UI 缩放就填1.25,200% 就填2.0。我遇到过一次非常特殊的案例:系统设置里的缩放是 100%,但笔记本电脑的物理分辨率是 2K,WPS 默认没有做任何缩放,字体小又虚,设置了QT_SCALE_FACTOR=1.5之后整个界面和字体都清晰了。

4.3 WPS 内部的字体平滑选项

WPS 自身也提供了字体显示相关的选项。在 WPS 的“选项”或“配置工具”里,找到一个叫“字体平滑”或“启用字体平滑”的开关。如果这个选项是打开的,建议先关掉,然后重启 WPS 对比一下。

我自己的实测经验是:WPS 的字体平滑在 Linux 版上效果不稳定,打开时中文小字容易出现不必要的笔画增粗,关闭后反而能保持和系统渲染一致。如果关闭后文字变清晰了,说明之前的问题有一部分就是 WPS 自己叠加上去的处理,而不是系统渲染的问题。

4.4 一个容易忽略的细节:删除 WPS 字体缓存

配置改完后,WPS 不一定立刻生效,因为它第一次启动时已经缓存了字体列表和渲染参数。这时候去把 WPS 的字体相关缓存目录删掉,让它强制重建缓存:

find ~/.local/share/kingsoft -type d -name "*font*" 2>/dev/null find ~/.cache -type d -name "*wps*" 2>/dev/null

把找到的带 font 字样的目录删除,或者更省事的做法是,直接把~/.local/share/kingsoft下和字体相关的缓存目录删掉。

前面提到的备份命令是:

rm -rf ~/.config/fontconfig/fonts.conf.bak cp ~/.config/fontconfig/fonts.conf ~/.config/fontconfig/fonts.conf.bak

我建议把这一步做成标准动作。我见过太多案例是因为用户改了字体配置但没清缓存,回头判断“这个办法没效果”,实际只是缓存没刷新。

5. 一次完整的实操流程记录

5.1 从零到修复的操作序列

假设我们现在在一台刚装好 Ubuntu 的机器上,WPS 已经装好,字体仍然一格一格糊着。完整操作顺序如下:

sudo apt update sudo apt install fonts-noto-cjk fonts-noto-cjk-extra fonts-wqy-microhei fonts-wqy-zenhei

编辑字体配置:

mkdir -p ~/.config/fontconfig vim ~/.config/fontconfig/fonts.conf

写入的内容就是 3.2 和 4.1 里的那两段 XML,注意放在同一个fontconfig根节点下,保存退出。

刷新字体缓存:

fc-cache -fv fc-match SimSun

验证输出结果应该指向Noto Serif CJK SC。确认无误后,启动 WPS:

wps

如果 WPS 已经开着,先全部退出。再打开一份之前字体发虚的文档,观察变化。

5.2 修改前后效果对比

实操对比记录如下表:

检查项修改前修改后
正文宋体粗壮、笔画粘连字形清晰,笔画轻盈
标题黑体明显加粗、有杂边粗细正常,边缘平滑
小字号(小四/五号)模糊、发灰清晰、无明显彩色边
英文 Times New Roman默认回退到衬线字体,尚可明确映射到 Liberation Serif,排版稳定

这个表里的“前”“后”差异非常明显,尤其是小字号正文,修改前真的是没法看。

5.3 遇到问题如何回滚

如果改完以后发现系统里其他软件的字体反而不对劲了,不用慌,恢复备份即可:

mv ~/.config/fontconfig/fonts.conf.bak ~/.config/fontconfig/fonts.conf fc-cache -fv

然后把 WPS 重启,一切回到原样。这也是为什么我坚持用用户级配置而不是直接改/etc/fonts/conf.d/全局配置:回滚成本低,不需要 sudo,也不影响其他用户。

6. 常见问题速查与独家避坑

6.1 改了配置,字体还是模糊

常见原因有三个:

  • 缓存没刷新:fc-cache -fv忘记执行,或者 WPS 还在用旧的字体扫描结果。处理方法是刷新缓存后,删除 WPS 字体缓存目录再重启。
  • DPI 不对:如果你的分辨率比较高,但系统缩放是 100%,可以尝试设置QT_SCALE_FACTOR=1.25或1.5。这一点在高分屏笔记本上特别常见。
  • Hinting 策略过强:检查~/.config/fontconfig/fonts.conf里是不是不小心写成了hintfull,改成hintslight再试。

6.2 设置了替换规则,字体还是加粗

一是 WPS 配置里开了“字体平滑”,关掉重启。二是 fontconfig 匹配到了某个字重的粗体变体,而不是常规字重。此时可以在 fonts.conf 里对目标家族追加字重限制:

<match target="pattern"> <test name="family"><string>Noto Serif CJK SC</string></test> <edit name="weight" mode="assign"><const>regular</const></edit> </match>

这里把Noto Serif CJK SC的字重强制设为 regular,禁止匹配到 bold 变体。不过这条规则要谨慎使用,因为如果字体真的需要粗体,强制 regular 会让标题失去层级感。我更建议先检查 WPS 文档里是否真的设置了粗体样式,而不仅仅是字体匹配问题。

6.3 升级 WPS 或者系统后,问题又复现

WPS 升级时可能会重置自己的字体设置,但用户级fonts.conf一般不会被动。系统大版本升级偶尔会重新生成~/.config/fontconfig下的配置,如果出现复现,直接把备份的fonts.conf恢复回去就行。

另外,安装新字体之后一定要重新执行fc-cache -fv,否则新字体不会进入匹配池。

6.4 独家经验:先判断是“加粗”还是“字重匹配错误”

很多人会把“字体重匹配”误判为“粗体问题”。表现很像,但处理方式不同。fc-match SimSun如果返回的是Noto Sans CJK SC Bold,那说明匹配到了 Bold 变体,问题在 fontconfig 回退顺序,要调整 alias 里的 prefer 列表,把 Regular 优先放进去;如果返回的是Noto Sans CJK SC Regular,但显示依然粗,那问题大概率出在 Hinting 参数或 WPS 的字体平滑开关上。先跑一次fc-match定位,再动手改配置,能少走很多弯路。

还有个实用小技巧:多装一套开源字重完整的字体(比如思源黑体完整版)往往能直接“压掉”加粗问题,因为回退匹配时优先命中的是 Regular 字重,而不是系统找不到合适字体时用的合成粗体。

7. 写在最后的实际操作体会

整个流程走下来,我个人最深的体会是:涉及字体的坑,绝大多数不是“配置语法有多难”,而是“你以为改了但其实没生效”。缓存、WPS 内部开关、系统渲染参数,这三个环节只要漏掉一个,前面做的所有配置都白费。所以我会强烈建议,每改完一步就立刻验证一步,fc-match是最直观的验证工具,比反复打开文档试错高效得多。

最后再分享一个小技巧:如果你经常需要在 Ubuntu 和 Windows 之间来回处理文档,与其让 WPS 每次都去回退字体,不如建立一套自己的字体映射模板,把常用的 Windows 字体名全部映射到 Noto 和文泉驿这套开源组合上。这样无论文档里用的是宋体、黑体、楷体还是微软雅黑,开到 Linux 上观感都相对稳定。这套配置我用了很久,基本没有再手动折腾过字体,也算是一劳永逸了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进