简介这份资源面向在 Ubuntu 系统下使用 WPS 办公软件、却频繁遇到字体缺失提示的用户尤其是需要处理含特殊符号文档的办公与排版人群。当 WPS 弹出缺少 Symbol、Wingdings、Wingdings 2、Wingdings 3 等字体的警告时文档中的符号与图形往往显示为问号或空缺本资源正是针对这一痛点提供的 TrueType 字体补充包。压缩包共收录 129 个文件其中 128 个为 ttf 字体文件另附 1 个 install.sh 一键安装脚本整体约 58.08MB字体文件覆盖符号、西文与部分中文字形脚本则用于自动化完成字体注册免去逐个手动添加的繁琐。目前已有 1434 人学习下载说明该方案在同类问题中具备一定参考价值。解压后进入 ttf-wps-fonts 目录执行脚本即可完成部署帮助读者恢复文档符号的正常显示保证排版完整性与办公效率。1. 字体缺失不是 WPS 的锅Ubuntu 下中文排版翻车的真实原因很多人第一次在 Ubuntu 上打开 WPS 处理一份带中文的文档看到的是这样的画面标题变成一排方块正文里的宋体、黑体全部消失公式里的符号错位打印预览更是一片空白。第一反应通常是「WPS 对 Linux 支持太差」于是卸载重装、换版本、甚至怀疑系统语言没配好。折腾一圈下来问题依旧。真相是WPS 本身并不携带完整的中文字体集。它依赖操作系统提供字体通过 fontconfig 去查找和匹配。Ubuntu 默认安装的字体包以拉丁字符为主中文字体覆盖极少所以 WPS 在渲染中文时找不到对应字形只能回退到方块或默认字体。这不是 WPS 的缺陷而是 Linux 桌面环境字体管理机制决定的。这个标题要解决的问题非常具体在 Ubuntu 系统下让 WPS 正常显示和打印中文文档。适合两类人——一是刚从 Windows 迁移到 Ubuntu 的办公用户二是需要在 Linux 服务器或开发机上处理中文文档的工程师。核心思路不是改 WPS 配置而是把缺失的字体补进系统再让 fontconfig 正确识别。2. 先搞清楚 WPS 到底在找什么字体fontconfig 匹配机制与字体清单2.1 fontconfig 的查找顺序与 WPS 的字体请求Linux 下的字体管理核心是 fontconfig。应用程序不直接读取字体文件而是向 fontconfig 发起请求描述自己需要的字体特征family、style、language 等fontconfig 返回匹配结果。WPS 在渲染中文时会依次请求「宋体」「黑体」「仿宋」「楷体」等 family 名称如果系统里没有注册这些名称fontconfig 就会走 fallback 逻辑尝试用其他字体替代。替代失败就是方块。理解这一点很关键你不需要把 Windows 字体原封不动搬过来而是要让 fontconfig 能识别并匹配到可用的中文字体。常见做法是安装开源中文字体包或者把已有字体文件放到系统字体目录并刷新缓存。先看当前系统里有哪些中文字体可用# 列出 fontconfig 当前能匹配到的中文字体 fc-list :langzh # 查看某个具体 family 的匹配结果比如宋体 fc-match SimSun fc-match 宋体 # 查看 WPS 进程实际加载了哪些字体需要先打开 WPS fc-list | grep -i wpsfc-list :langzh会输出所有支持中文的字体文件路径和 family 名称。如果输出为空说明系统里没有任何中文字体问题根源确认。fc-match SimSun会告诉你 fontconfig 实际匹配到了哪个字体如果返回的是某个拉丁字体说明 fallback 没有命中中文。2.2 常见中文字体包与安装方式对比Ubuntu 仓库里有几个常用的中文字体包选择哪个取决于你的文档需求字体包包含字体适用场景安装命令fonts-noto-cjkNoto Sans CJK / Noto Serif CJK通用中文显示开源免费sudo apt install fonts-noto-cjkfonts-wqy-zenhei文泉驿正黑基础中文显示体积小sudo apt install fonts-wqy-zenheifonts-wqy-microhei文泉驿微米黑屏幕阅读优化sudo apt install fonts-wqy-microheifonts-arphic-umingAR PL UMing仿宋风格适合公文sudo apt install fonts-arphic-umingfonts-arphic-ukaiAR PL UKai楷体风格sudo apt install fonts-arphic-ukai如果文档里明确指定了「宋体」「黑体」「仿宋」这些 Windows 字体名称开源字体包的 family 名称可能对不上。这时候有两种策略一是安装字体后手动建立 family 别名映射二是直接引入 Windows 字体文件。前者更干净后者更直接。我一般会先装 Noto CJK 作为基础覆盖再根据文档实际用到的字体名称做别名映射。这样既保证系统里有可用的中文字体又能让 WPS 的字体请求命中正确的 family。2.3 安装字体并刷新缓存的完整操作安装字体包本身很简单关键是安装后的缓存刷新和验证# 更新包索引并安装 Noto CJK 字体 sudo apt update sudo apt install -y fonts-noto-cjk fonts-noto-cjk-extra # 如果还需要文泉驿系列 sudo apt install -y fonts-wqy-zenhei fonts-wqy-microhei # 刷新 fontconfig 缓存 sudo fc-cache -fv # 验证中文字体是否已注册 fc-list :langzh | head -20fc-cache -fv中的-f表示强制重建缓存-v输出详细过程。这一步不能省否则新装的字体不会立即生效。fc-list :langzh应该能看到 Noto Sans CJK 和 Noto Serif CJK 的多个字重。装完之后打开 WPS如果文档里用的是「宋体」「黑体」这类名称可能仍然显示不正常因为 fontconfig 不知道「宋体」对应哪个 Noto 字体。这就需要下一步的别名配置。3. 让 WPS 认出「宋体」和「黑体」fontconfig 别名配置实战3.1 创建用户级 fontconfig 配置文件fontconfig 的配置文件放在/etc/fonts/conf.d/和~/.config/fontconfig/conf.d/两个位置。系统级配置影响所有用户用户级配置只影响当前用户。我倾向于用用户级配置避免污染系统环境也方便迁移和备份。先创建目录和配置文件# 创建用户级 fontconfig 配置目录 mkdir -p ~/.config/fontconfig/conf.d # 创建别名映射配置文件 cat ~/.config/fontconfig/conf.d/99-wps-chinese.conf EOF ?xml version1.0? !DOCTYPE fontconfig SYSTEM fonts.dtd fontconfig !-- 把宋体映射到 Noto Serif CJK SC -- match targetpattern test namefamilystringSimSun/string/test edit namefamily modeassign bindingstrong stringNoto Serif CJK SC/string /edit /match match targetpattern test namefamilystring宋体/string/test edit namefamily modeassign bindingstrong stringNoto Serif CJK SC/string /edit /match !-- 把黑体映射到 Noto Sans CJK SC -- match targetpattern test namefamilystringSimHei/string/test edit namefamily modeassign bindingstrong stringNoto Sans CJK SC/string /edit /match match targetpattern test namefamilystring黑体/string/test edit namefamily modeassign bindingstrong stringNoto Sans CJK SC/string /edit /match !-- 仿宋映射到 AR PL UMing -- match targetpattern test namefamilystringFangSong/string/test edit namefamily modeassign bindingstrong stringAR PL UMing CN/string /edit /match match targetpattern test namefamilystring仿宋/string/test edit namefamily modeassign bindingstrong stringAR PL UMing CN/string /edit /match !-- 楷体映射到 AR PL UKai -- match targetpattern test namefamilystringKaiTi/string/test edit namefamily modeassign bindingstrong stringAR PL UKai CN/string /edit /match match targetpattern test namefamilystring楷体/string/test edit namefamily modeassign bindingstrong stringAR PL UKai CN/string /edit /match /fontconfig EOF这段配置的核心是match targetpattern块。targetpattern表示匹配的是应用程序发来的字体请求而不是系统里已有的字体。test namefamily判断请求的 family 名称edit namefamily modeassign bindingstrong把请求重写为指定的字体。bindingstrong确保这个映射优先级足够高不会被其他规则覆盖。3.2 刷新缓存并验证映射是否生效配置文件写完后必须刷新缓存才能生效# 刷新用户级 fontconfig 缓存 fc-cache -fv ~/.config/fontconfig # 验证映射结果 fc-match 宋体 fc-match SimSun fc-match 黑体 fc-match SimHei fc-match 仿宋 fc-match 楷体fc-match 宋体应该返回Noto Serif CJK SC相关的字体文件路径。如果返回的还是默认拉丁字体说明配置文件没有被加载。检查两点文件是否放在~/.config/fontconfig/conf.d/目录下文件名是否以.conf结尾。另外fc-cache刷新的是字体缓存配置文件的加载顺序由 fontconfig 自己管理通常不需要额外操作。验证通过后重启 WPS。注意是彻底退出 WPS 进程再重新打开而不是关闭窗口。可以用pkill wps确保进程结束。3.3 直接引入 Windows 字体文件的替代方案如果文档对字体还原度要求极高比如需要精确匹配 Windows 下的宋体、黑体、仿宋、楷体开源字体的字形和字距可能有细微差异。这时候可以直接把 Windows 字体文件复制到 Ubuntu 字体目录。常见做法是从已有 Windows 系统中提取字体文件或者从合法渠道获取。字体文件通常放在C:\Windows\Fonts\目录下需要关注的文件包括simsun.ttc宋体 新宋体simhei.ttf黑体simfang.ttf仿宋simkai.ttf楷体msyh.ttc微软雅黑把这些文件复制到/usr/share/fonts/windows/或~/.local/share/fonts/目录# 创建 Windows 字体存放目录 sudo mkdir -p /usr/share/fonts/windows # 复制字体文件假设字体文件在当前目录的 fonts 文件夹下 sudo cp fonts/*.ttc fonts/*.ttf /usr/share/fonts/windows/ # 设置权限 sudo chmod 644 /usr/share/fonts/windows/* # 刷新系统字体缓存 sudo fc-cache -fv # 验证 fc-list | grep -i simsun fc-list | grep -i simhei这种方式的优点是字体名称完全匹配WPS 不需要别名映射就能直接找到「宋体」「黑体」。缺点是字体文件版权归属需要留意另外.ttc是字体集合文件一个文件里可能包含多个字体fontconfig 会自动解析。提示如果同时配置了别名映射和直接引入字体文件fontconfig 会优先使用直接匹配到的字体。别名映射作为 fallback 仍然有效不会冲突。4. 避坑指南字体配置中最容易翻车的五个场景4.1 装了字体但 WPS 里还是方块现象fc-list :langzh能看到中文字体但 WPS 打开文档仍然显示方块。原因WPS 有自己的字体缓存机制不会在每次启动时重新读取 fontconfig 的全部配置。另外WPS 可能优先读取自身安装目录下的字体配置。解决彻底退出 WPS 进程pkill wps删除 WPS 的用户配置缓存目录通常在~/.config/Kingsoft/下再重新启动。如果仍然不行检查 WPS 是否使用了独立的 fontconfig 配置文件可以在启动脚本里显式指定FONTCONFIG_FILE环境变量。4.2 fc-cache 刷新后 fc-match 结果没变化现象执行了fc-cache -fv但fc-match 宋体返回的还是旧结果。原因fontconfig 的缓存分为系统级和用户级fc-cache默认刷新的是系统级缓存。用户级配置文件的缓存可能需要单独刷新或者配置文件的加载顺序被其他规则覆盖。解决用fc-cache -fv ~/.config/fontconfig单独刷新用户级缓存。检查~/.config/fontconfig/conf.d/下的文件名排序数字前缀越小优先级越高。如果系统级配置里有更强的规则用户级配置可能被覆盖可以把文件名前缀改成更小的数字比如00-wps-chinese.conf。4.3 中文显示正常但英文和数字变成乱码现象中文字体配置好后文档里的英文和数字显示异常字距不对或者字形奇怪。原因把中文字体映射到了所有字符集导致英文和数字也用了中文字体的拉丁字形。中文字体的拉丁部分通常设计得比较粗糙。解决在 fontconfig 配置里增加对语言和字符集的判断只对中文请求做映射。可以用test namelang判断请求语言或者用test namecharset判断字符集。更简单的做法是保留系统的拉丁字体优先级只在中文字体请求时做 fallback。4.4 打印预览正常但实际打印出来字体不对现象WPS 里显示正常打印预览也正常但打印机输出的文档字体变了。原因打印时 WPS 可能把字体嵌入 PDF 或者直接发送字体数据给打印机。如果字体文件本身有问题或者打印机驱动不支持该字体格式就会回退到打印机内置字体。解决在 WPS 打印设置里勾选「将字体嵌入文档」或「打印为图像」。如果打印机支持 PostScript可以尝试用gs命令先转成 PDF 再打印。另外检查/etc/cups/下的打印机配置确保没有强制字体替换规则。4.5 系统更新后字体配置被覆盖现象之前配置好的字体系统更新后突然失效。原因某些系统更新会重装fontconfig-config包覆盖/etc/fonts/conf.d/下的配置文件。用户级配置通常不受影响但如果之前改的是系统级配置就可能被重置。解决尽量使用用户级配置~/.config/fontconfig/conf.d/避免修改系统级文件。如果必须用系统级配置把自定义配置放在/etc/fonts/conf.d/下并确保文件名前缀在99-之后同时备份配置文件更新后检查是否被覆盖。5. 进阶技巧用 fontconfig 规则做字体优先级排序与批量验证5.1 用 prefer 规则控制字体回退顺序除了别名映射fontconfig 还支持alias和prefer规则用来控制同一 family 下的字体优先级。比如系统里同时装了 Noto Sans CJK 和文泉驿正黑你希望 WPS 优先使用 Noto可以这样配置?xml version1.0? !DOCTYPE fontconfig SYSTEM fonts.dtd fontconfig alias familysans-serif/family prefer familyNoto Sans CJK SC/family familyWenQuanYi Zen Hei/family /prefer /alias alias familyserif/family prefer familyNoto Serif CJK SC/family familyAR PL UMing CN/family /prefer /alias /fontconfigalias定义了一个通用 family 名称prefer里的字体按顺序优先匹配。这样即使应用程序请求的是sans-seriffontconfig 也会优先返回 Noto Sans CJK SC。对于 WPS 来说很多默认字体请求就是sans-serif和serif这个配置能显著改善默认显示效果。5.2 批量验证字体映射的脚本手动一条条fc-match效率太低我一般写个脚本批量检查常用中文字体名称的映射结果#!/bin/bash # check-fonts.sh - 批量验证中文字体映射 FONTS( 宋体 SimSun 新宋体 NSimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 仿宋 FangSong 楷体 KaiTi Noto Sans CJK SC Noto Serif CJK SC ) echo 字体名称 | 匹配结果 echo ---------|---------- for font in ${FONTS[]}; do result$(fc-match $font 2/dev/null) echo $font | $result done把这段保存为check-fonts.shchmod x check-fonts.sh后执行。输出结果里如果某个字体名称匹配到了不含 CJK 的字体文件就说明映射没生效需要检查配置文件。5.3 用 fontconfig 调试模式定位匹配过程当映射结果不符合预期时FC_DEBUG环境变量可以输出 fontconfig 的详细匹配过程# 输出 fontconfig 匹配「宋体」的详细过程 FC_DEBUG1024 fc-match 宋体 21 | head -50 # 只看配置文件加载顺序 FC_DEBUG1 fc-match 宋体 21 | grep -i loadingFC_DEBUG1024会打印匹配规则的每一步判断包括哪些配置文件被加载、哪些规则被命中、最终为什么选择了某个字体。这个输出比较长建议配合grep过滤关键信息。我一般在配置复杂规则时用它来确认优先级是否符合预期。5.4 把配置固化到新系统安装流程如果经常需要在多台 Ubuntu 机器上部署相同的字体环境可以把字体文件和 fontconfig 配置打包成一个安装脚本#!/bin/bash # setup-wps-fonts.sh - 一键配置 WPS 中文字体环境 set -e echo 安装基础中文字体包... sudo apt update sudo apt install -y fonts-noto-cjk fonts-noto-cjk-extra fonts-wqy-zenhei fonts-arphic-uming fonts-arphic-ukai echo 部署 fontconfig 别名配置... mkdir -p ~/.config/fontconfig/conf.d cp ./99-wps-chinese.conf ~/.config/fontconfig/conf.d/ echo 刷新字体缓存... fc-cache -fv ~/.config/fontconfig sudo fc-cache -fv echo 验证映射结果... fc-match 宋体 fc-match 黑体 echo 完成。请重启 WPS 使配置生效。这个脚本把前面所有步骤串起来新机器上执行一次就能搞定。注意set -e让脚本在任意命令失败时立即退出避免中间步骤出错后继续执行导致状态不一致。字体配置这件事说到底就是让 fontconfig 的匹配结果符合 WPS 的预期。我踩过最深的坑是改了系统级配置后忘记刷新用户级缓存结果排查了半天才发现是缓存没更新。现在的习惯是所有配置都放用户级目录改完必跑fc-cache -fv然后用fc-match逐条验证。希望帮到你。本文还有配套的精品资源点击获取