简介:在 Ubuntu 系统下使用 WPS 办公软件时,如果文档排版用到 Symbol、Wingdings 等特殊符号字体,而系统中并未预装,就会导致字符显示为方框或问号,严重影响阅读和处理效率。这套字体集正是为解决这一实际问题而编排,面向 Linux 桌面用户、频繁处理 Windows 来源文档的办公人员以及需要在 WPS 中保持排版一致性的使用者。资源打包了完整的 TTF 字体集合,并将安装动作整理成一条命令执行,无需手动逐个复制字体文件。
整个压缩包共包含 129 个文件,其中 128 个为 TrueType 格式字体,覆盖 Wingdings 系列、Symbol 等常见符号及正文字体,另有 1 个 install.sh 安装脚本。压缩包容量约 58.08MB,已有 1442 人浏览学习。
从使用价值来看,用户只需解压后运行脚本,即可将这些字体安装到系统字体目录中,WPS 打开含特殊字符的文档时能正确渲染,避免出现空白、占位符或乱码。这套字体不只适用于 WPS,对 LibreOffice 等 Linux 办公套件的字体兼容也有帮助,适合需要长期在 Linux 下跨平台处理文档的人群,是一套实用的小型字体解决方案。
1. Ubuntu 下 WPS 缺字体的通病:不是软件坏了,是字体没喂饱
wps linux 字体集 ttf 这个话题,我第一次碰到是在给某高校办公电脑装 Ubuntu 替代 Windows 时。WPS 装好,系统没报错,可一打开历年 docx,正文全是方块,标题变成点阵,打印预览一堆问号。换 LibreOffice 打开却正常——问题被定位到字体上。WPS 在 Linux 下把渲染交给系统 fontconfig 字体库,Ubuntu 默认只有 Noto 和文泉驿,docx 里的宋体、仿宋、楷体、黑体全匹配不上,回退成一片豆腐块。这份资源的本质:一包按 WPS 场景整理好的 ttf 字体集,配安装脚本,解决「系统没有对应字体文件」这个最原始的问题。适合刚迁移到 Linux、天天要开历史文档的办公党,也适合批量装机的人。
2. 字体缺失的底层逻辑:WPS 找字体的路径与 ttf 字体集的构成
2.1 黑匣子之外:为什么 WPS 在 Linux 上特别容易「变脸」
Windows 上很少遇到缺字问题,因为系统自带宋体、黑体等一整套中文字体,WPS 装完直接用。Linux 发行版出于体积和授权考虑,默认字库里塞的是 Noto Sans CJK、文泉驿这类开源字体,覆盖常用汉字没问题,但名字和 docx 里记录的对不上。
docx 本身不内嵌字体,它只记录字体名,比如 SimSun、Microsoft YaHei。渲染时由系统按名字去字体库查找,Linux 上负责这件事的是 fontconfig。它有一套匹配规则:先精确匹配字体名,匹配不到就按替换规则回退。WPS 内部还有一张自己的字体替换表,系统找不到宋体,它就自作主张把文本交给 Noto Sans CJK 渲染。
问题来了:宋体是衬线体,笔画有粗细变化,字面较窄;Noto Sans CJK 是无衬线体,笔画均匀,字面宽。替换之后文字确实显示出来了,但中英文混排时宽度对不上,行距、缩进全变了。更糟的是标题里的黑体(SimHei)和正文里的宋体(SimSun)在替换后变成了同一种字形,整个文档的大小标题、正文、引文全部一个长相,公文的层级感直接消失。
真正显示成方块(业内叫 tofu)的情况反而少一些:只有当回退链条上也找不到任何可用字形时,比如字体文件缺失且系统里没有任何 CJK 字体,才会画出空方框。大多数时候的问题是「有字但不对」。
2.2 字体集的配方:一份合格 ttf 包里到底装了什么
拿一份按 WPS 日常办公场景整理的字体集来看,内容通常包括下面几类,缺一不可。
| 类别 | 字体名 | 典型文件名 | 在 WPS 里负责什么 |
|---|---|---|---|
| 中文宋体类 | 宋体 SimSun / 新宋体 NSimSun | simsun.ttf / nsimsun.ttf | 公文正文、书籍排版、默认正文 |
| 中文黑体类 | 黑体 SimHei | simhei.ttf | 标题、强调、表头 |
| 中文楷体类 | 楷体 KaiTi | kaiti.ttf | 引文、批注、公文特定格式 |
| 中文仿宋类 | 仿宋 FangSong | simfang.ttf | 政府/机关公文正文 |
| 中文雅黑类 | 微软雅黑 Microsoft YaHei | msyh.ttf | 无衬线标题、界面文字 |
| 西文衬线 | Times New Roman | times.ttf | 正文西文部分、数字 |
| 西文无衬线 | Arial | arial.ttf | 标题西文部分、UI 文字 |
| 西文等宽 | Courier New / Courier | cour.ttf | 代码段、等宽排版 |
有一件事必须强调:这类资源里如果混入了 ttc 文件,最好先确认 WPS 是否认。 ttc 是把多个字体打包在一个文件里,fontconfig 能读,但 WPS 在 Linux 上的个别旧版本只加载 ttc 里的第一个字体,后面几个字族直接消失。所以使用下载到的 wps 字体集时,我一般只挑 ttf 格式的字体,宁多一个文件,不赌一个 ttc。
微软雅黑本身常见封装就是 msyh.ttc,正规字体集通常会把雅黑拆成单独的 ttf 或同时附上兼容字体。在安装前花一分钟确认格式,比装完发现缺字再从头折腾要省事得多。
2.3 安装前先诊断:两条命令看清系统的字体底牌
不要在还没搞清楚缺什么的情况下就直接装字体。先看一眼系统现状,避免装完发现是另一套文件名对不上。
# 列出系统当前可用的中文字体旋律,按名称去重排序,快速判断家底 fc-list :lang=zh family | sort -u # 精确检查 WPS 最常缺的几个字体名,存在则输出字体文件路径 fc-list | grep -iE 'simsun|simhei|kaiti|fangsong|ms yahei|times new roman'第一条命令里参数:lang=zh是 fontconfig 的查询语法,只返回覆盖中文的语言族名称,不会把路径里碰巧带 zh 字符的字体也算进来。管道后面的sort -u做去重,因为同一套字体可能被多个目录重复扫描,不排序直接看会以为系统有很多字体,实际上来来回回就那三四个。
第二条命令直接用 grep 匹配关键字体名,-i 忽略大小写。如果这一条一个结果都没有,说明缺得很全面,直接把 ttf 字体集整包装上去就对了;如果只出了 Times New Roman,没有 SimSun 和 SimHei,说明你只需要补中文字体。这里有个容易误判的地方:fc-list 输出的是字体的 family 名,中文可能显示为「宋体」,也可能显示为「SimSun」,所以 grep 关键词要同时覆盖中文名和英文名。上面这条命令里的关键词组合,基本覆盖了 WPS 最常见的引用方式。
3. 安装字体集的完整流程:从解压到 WPS 生效的一次走通
3.1 先看清资源底细:压缩包里都是什么
下载下来的字体集一般是个压缩包,常见格式是 zip 或 tar.gz。解压之后目录结构大致长这样:
wps-fonts/ ├── install.sh ├── README.md └── fonts/ ├── simsun.ttf ├── simhei.ttf ├── kaiti.ttf ├── simfang.ttf ├── msyh.ttf ├── times.ttf ├── arial.ttf └── cour.ttf打开 README 扫一眼有没有写授权说明或来源,然后按格式解压。zip 用 unzip,tar.gz 用 tar。
# zip 格式:解压到当前目录 unzip wps-fonts.zip # tar.gz 格式:-x 解包,-z 解 gzip,-v 显示过程,-f 指定文件名 tar -xzvf wps-fonts.tar.gz解压后不要急着跑 install.sh,先ls -l fonts/看一眼文件权限。我遇到过打包时权限信息丢失的情况,字体文件变成 600,只有打包者能读;后面安装时即使复制过去了,WPS 以普通用户运行照样读不到,又得回头改,属于完全能避开的坑。如果看到权限不对,先chmod 644 fonts/*.ttf再继续。
3.2 手动安装:五条命令把每一步看清
我习惯先手动装一遍再上脚本,原因很简单:脚本自动化之后出了问题,你不知道卡在哪一步。手动过程其实就是五个动作:建目录、复制、授权、刷缓存、验证。
# 1. 创建系统级字体目录;wps-fonts 是自定义子目录,方便以后整体卸载 sudo mkdir -p /usr/share/fonts/truetype/wps-fonts # 2. 把字体复制进目标目录;保留子目录结构,后续更新时能直接覆盖 sudo cp -r fonts/*.ttf /usr/share/fonts/truetype/wps-fonts/ # 3. 字体文件必须可被所有用户读取;644 是最稳妥的权限,所有者和组不影响 WPS 使用 sudo chmod 644 /usr/share/fonts/truetype/wps-fonts/*.ttf # 4. 强制重建字体缓存;-f 忽略时间戳,-v 打印处理细节,方便确认没有扫描报错 sudo fc-cache -fv /usr/share/fonts/truetype/wps-fonts # 5. 验证安装结果:grep 到路径说明 fontconfig 已能看到新字体 fc-list | grep -i simsun第 1 步的mkdir -p加了 -p,目录存在时不报错,重复执行也不会翻车。第 2 步cp -r保留子目录,如果字体集里还有二级目录,比如西文单独放在 Western/ 下面,这一步不会漏。第 3 步是关键中的关键,很多「装完还是方块」的问题就出在文件权限上——字体文件复制过去了,但权限是 640 或 600,WPS 以你登录的身份启动,读取时被系统拒绝,表现和没装一模一样。
第 4 步的-f参数容易被忽略。字体目录不变时 fontconfig 依赖缓存时间戳判断是否需要重建,而新增的文件有时因为打包工具保留了原时间戳,导致缓存误认为「没变化」而不刷新。加 -f 强制全量重建,代价只是多等几秒,换来的是确定性。第 5 步验证输出,grep 到路径就说明 fontconfig 层面已经通了,剩下的是 WPS 自己认不认的问题。
3.3 一键安装脚本:读懂了再用,别闭眼执行
字体集里带的 install.sh 一般长这样,细节每家封装略有不同,但骨架基本一致。
#!/bin/bash set -euo pipefail FONT_DIR="/usr/share/fonts/truetype/wps-fonts" INSTALL_DIR="$(cd "$(dirname "$0")" && pwd)/fonts" # 目标目录不存在则创建 sudo mkdir -p "$FONT_DIR" # 已存在旧字体则先清除,避免文件更新后字符集残留 if ls "$FONT_DIR"/*.ttf >/dev/null 2>&1; then sudo rm -f "$FONT_DIR"/*.ttf fi # 递归查找所有 ttf 并复制,不限一级子目录 find "$INSTALL_DIR" -name '*.ttf' -exec sudo cp {} "$FONT_DIR/" \; # 统一权限,防止打包导致的可读性问题 sudo chmod 644 "$FONT_DIR"/*.ttf # 刷新缓存,输出重定向到黑洞,只保留成功提示 sudo fc-cache -fv "$FONT_DIR" >/dev/null echo "fonts installed to $FONT_DIR"这里值得注意的几处写法:set -euo pipefail让脚本遇到任何未处理错误就退出,不会出现「前面失败了后面还继续执行」的连锁问题;find -exec比cp fonts/*.ttf更稳,因为字体可能分散在子目录里,通配符只能匹配一层;先rm -f旧 ttf 再复制,是为了避免同名更新时字体索引混乱——比如旧版 SimSun 和新版 SimSun 文件不同名但 family 相同,残留会导致 fontconfig 匹配到两份,WPS 的字体列表里出现重复项。
执行方式上有个细节:用sudo bash install.sh还是直接bash install.sh?脚本内部已经用了 sudo,所以不加 sudo 直接跑即可。但如果字体集放在家目录下且有写权限,你也可以自己改成用户级安装:把 FONT_DIR 换成~/.fonts,去掉所有 sudo,然后手动刷缓存。用户级安装不需要 root,缺点是有时候 WPS 的沙箱环境不读用户目录字体,系统级目录更保险。
4. 让 WPS 认到新字体:缓存刷新、重启与字体替换设置
4.1 两个缓存层次:fontconfig 缓存和 WPS 自己的快照
字体装完只是完成了系统层面的一半,WPS 能不能立刻用是另一回事。很多人在装完字体集的当天就被这个问题卡住:fc-list里明明有 SimSun,打开 WPS 字体下拉框却找不到,怀疑字体没装上,又重新装了一遍,实际是白折腾。
原因在于 WPS 在启动时会扫描一次系统字体列表,然后把结果缓存到自己的配置目录里,整个运行期间不再重新扫描。你是在 WPS 已经开着的情况下安装字体的,它到退出都不会知道有新字体加入。
处理办法很简单:彻底退出 WPS,确认进程已经不存在,再重新打开。
# 按进程名结束 WPS 所有进程,防止托盘残留沿用旧缓存 pkill -f wps # 等待两秒让进程完全退出,再手动确认没有残留 sleep 2 pgrep -f wps || echo "wps not running"pkill把命令行里带 wps 字符的进程全部结束,这比一个个点关闭窗口靠谱,因为 WPS 在 Linux 下经常有后台驻留进程,窗口关了进程还活着。pgrep后面加|| echo,如果没有残留进程会打印提示,有的话会直接输出进程号,你看到输出就知道还有进程没死,需要再等或者手动 kill。有些装机环境会把 WPS 设成开机自启,重开文档前先去任务栏确认图标是否真的退出了。
4.2 字体替换设置:当系统仍然说「找不到宋体」
重启之后如果字体下拉框还是一片空白,问题就不是系统字体了,而是 WPS 的字体替换表在作怪。WPS 内置了一张「找不到某字体时用什么代替」的表,它在启动时检查系统字体,如果发现 SimSun 不存在,直接把它记成「已替换为 Noto Sans CJK」,并且替换结果也会被缓存。
处理路径:打开任意 docx → 点击左上角 WPS 图标 → 工具 → 字体替换。不同版本的菜单位置略有差异,有的在「文件-选项」里,有的在设置面板里,但都叫「字体替换」或「字体映射」。进到替换列表,看到类似「宋体 → 无」或「宋体 → Noto Sans CJK SC」的条目,把它改成「宋体 → SimSun」或者改成你已经安装好的字体,保存并重开文档。
替换映射的选法直接影响观感,别随手乱填:
| 文档里的字体名 | 推荐映射到 | 原因 |
|---|---|---|
| 宋体 SimSun | SimSun(宋体 ttf) | 原样匹配,观感最佳 |
| 黑体 SimHei | SimHei(黑体 ttf) | 标题保持厚重感 |
| 楷体 KaiTi | KaiTi(楷体 ttf) | 引文/批注不变形 |
| 仿宋 FangSong | FangSong(仿宋 ttf) | 公文正文保持规范 |
| 等线 DengXian | Noto Serif CJK SC | 找不到原字体时保底选择 |
| 微软雅黑 Microsoft YaHei | msyh(雅黑 ttf) | 无衬线风格不跑偏 |
这里必须提醒一句:映射到无衬线字体和映射到衬线字体差别很大。表格里凡是 docx 原本要求宋体的,宁可映射到 SimSun 也别映射到 Noto Sans CJK,否则文档里所有引号和括号的宽度都会变化,表格列宽塌掉是分分钟的事。
4.3 用一张「字体指纹」文档验证渲染没毛病
装完字体、改完替换表、重启 WPS,最后一步是验证。我习惯新建一个空白文档,分段输入固定测试文本,每段手动指定一种字体,专门用来检验字形是否正常。
测试文本要覆盖四类字符:中文常用字(段落、引文、状态)、中文生僻字(龘、爨这类)、全角标点(中文引号和括号)、西文数字和字母(Times New Roman 的衬线数字)。每段依次设置为宋体、黑体、楷体、仿宋、微软雅黑,字号放大到二号,然后看四个关键点。
第一,汉字不是方块。第二,数字和字母在宋体段落里显示衬线字形,不是黑体默认的机械数字。第三,中文引号不是半角直引号,而是弯引号。第四,标题段落在黑体下笔画均匀,没有出现某几个字像宋体的情况。这四点全部通过,说明字体集的安装和 WPS 识别都通了。如果某一段表现不对,比如指定宋体后出来的是无衬线字形,那基本可以断定 fontconfig 的别名设置优先了,往下看第 6 章的锁定方法。
5. 避坑指南:安装字体集最容易翻车的四个环节
5.1 现象:fc-list 能看到,WPS 字体列表还是空的
装完字体后终端里fc-list | grep simsun有输出,打开 WPS 字体下拉框却看不到宋体、黑体,列表里只有原来那三四个开源字体。
原因:WPS 把启动时扫描到的字体列表缓存在用户配置目录,重启前不会重新扫描;另一种可能是你装的是应用商店版 WPS,运行在隔离环境里,对系统字体目录的读取被拦了一道。
解决:先彻底重启 WPS,用 4.1 节里的 pkill 方式确认进程退干净了再重开。如果重启之后还是老样子,大概率是隔离环境的问题——最直接的办法是卸载应用商店版,改用官方 deb 包安装,跑完字体集再装 WPS,顺序反过来也试过,没差。从那以后我给机器装字体集时,都是先装字体再装 WPS,一次扫到位。
5.2 现象:文字显示出来了,但全都是同一个字形
标题、正文、引文在渲染结果里长得一模一样,没有粗细、衬线、字面的区别,整个文档像被一种字体洗过一遍。
原因:字体文件其实没装进去,或者装了但被 WPS 的替换表统一回退到了一个字体上。系统里确实有字体,但不是 docx 要的那个,WPS 用替身顶了包。
解决:先确认字体下拉框里能不能手动选到宋体和黑体,能选到说明字体在位,是替换表问题,去「字体替换」里把宋体、黑体、仿宋的映射单独改过来;当下拉框里根本没有这些名字,则回到第 3 章检查字体文件权限,重点看文件是不是 644。这两类问题症状相似,但解法完全不同,先选字体再查权限的顺序不会错。
5.3 现象:汉字正常了,数字和英文像从别处抠来的
中文部分渲染挺好,但一到英文和数字就模糊、发虚,或者明显和中文不在同一水平线上的感觉。
原因:字体集只装了中文,西文字体缺失。WPS 里的宋体段落,西文部分会走回退链去找 Times New Roman 或 Arial,找不到就落到一个和宋体字宽不匹配的替换字体上,混排观感全废。
解决:确认字体集中包含西文三件套:Times New Roman(衬线)、Arial(无衬线)、Courier New(等宽)。装完刷新缓存后,打开文档选中一段有中文有数字的文本,观察数字在中文宋体环境和楷体环境下是否都能自动切到对应西文字形。不能的话,检查这三个字体是否被字体替换表映射到了错误目标,优先映射到刚装进的西文原名上。
5.4 现象:脚本提示 Permission denied,但目录看起来没问题
跑 install.sh 时输出 "Permission denied",检查 /usr/share/fonts 的权限却发现目录权限确实可写。
原因:常见于用sudo sh install.sh执行,脚本内部又嵌套了 sudo,外层 sudo 已经切到 root,内层 sudo 再执行时找不到可用的终端环境,或者 HOME 环境变量指向了 root 的目录,脚本里相对路径全部错位。还有一个隐藏因素:某些发行版的字体目录被 SELinux/AppArmor 约束,普通 root 写入也被策略挡下,命令本身没错,但被安全策略拒绝了。
解决:改用bash install.sh直接执行,让脚本内部的 sudo 自理;如果仍然 Permission denied,检查系统是否启用了加固策略,临时用sudo setenforce 0做测试排除,确认是策略问题再恢复。我不建议把脚本改成所有文件全部chmod 777,那是饮鸩止渴,正经解法要么换目录,要么调整策略允许写入字体路径。
6. 进阶:用 fontconfig 别名锁死字体替换行为
第 5 章 5.2 里提到的「字体替换表乱映射」问题,治标的方法是手动去 WPS 里改映射,治本的方法是写一条 fontconfig 别名,强制系统把「宋体」这个名字解析到 SimSun.ttf,从源头掐断替换链。这样不管 WPS 内部怎么按名字查字体,系统竖在那里的回答只有一个。
在~/.config/fontconfig/fonts.conf里追加一段配置,没有这个文件就新建:
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <!-- 把「宋体」的别名请求强制指向 SimSun,避免回退到 Noto Sans --> <match target="pattern"> <test name="family"><string>SimSun</string></test> <edit name="family" mode="prepend" binding="strong"> <string>SimSun</string> </edit> </match> </fontconfig>核心在binding="strong"这个属性。fontconfig 匹配字体时,一个 family 名可能会按优先级被替换多次,默认的 bind 强度是 weak,意味着后面还有别的规则能把它再盖掉;strong 表示这条规则的优先级高,只要系统里有 SimSun 这个名字,就不会再用 Noto Sans 去顶替。如果你需要同时锁住黑体、仿宋、楷体,把 match 块复制几份,把 test 里的字符串逐个换掉就行。
写完配置执行fc-cache -f,然后用fc-match验证:
# 系统对「SimSun」这个名字实际解析到什么字体 fc-match SimSun # 对「宋体」中文名字的解析结果 fc-match 宋体两条命令的输出应该是同一个字体文件路径,比如/usr/share/fonts/truetype/wps-fonts/simsun.ttf。如果输出了 Noto Sans CJK SC,说明这条别名没生效,常见的低级错误是文件名或 family 名写错——先用 2.3 节里的 fc-list 查一下新装字体的 family 到底叫「SimSun」还是「宋体」,然后把配置里的 string 换成对的。字体集里同一款字体可能存在多个 family 别名,新宋体 NSimSun 和宋体 SimSun 是两个独立 family,不能混着写。
验证通过后,再回到 WPS 里造第 4.3 节的测试文档,这次应该一次就过。整个过程熟练之后一分钟就能做完:装字体、刷缓存、重启 WPS、写别名、fc-match 验证,五步。我过去图省事,装完字体不刷缓存直接开 WPS,结果文档打开全乱,检查了半天以为字体集有坑,最后发现只是缓存时间戳没刷新。从那以后我每次装完字体都强制走一遍fc-cache -f加重启 WPS 的流程,再没在这上面翻过车。希望这个流程帮到你。
本文还有配套的精品资源,点击获取