
十几年前我刚从 Windows 跳到 Ubuntu 的时候遇到的第一道坎不是命令难记而是打开网页、写文档、看 PDF全是方格子和豆腐块。那时候我一度以为是系统坏了后来才明白这就是典型的 Ubuntu 缺失字体问题。这个坑看上去不大但影响面极广从中文显示到应用渲染、从服务器报表到容器内截图几乎都能碰上。这篇文章我想把“ubuntu 安装缺失字体”这件事从头到尾捋清楚为什么缺、缺的是什么、怎么装、装完怎么验证以及我在实际环境中踩过的那些坑。不管你是刚装完 Ubuntu 24.04 的小白还是经常要在无桌面的服务器上开无头浏览器出图的运维这套方案都适用。1. 为什么Ubuntu会“缺字体”先搞清楚问题出在哪一层很多人遇到“缺字体”的第一反应是去下载字体文件但我觉得第一步应该先搞清楚系统是真的少了某种字体还是字体配置链路出了问题。Ubuntu 的字体显示不是一个简单的“放个 TTF 文件进去就能用”的过程它背后是一整套检索、匹配、回退机制。不理解这层你装的字体可能就是“装了个寂寞”。1.1 中文乱码和缺字体的本质区别“中文乱码”严格说有两种。一种是编码乱码比如 UTF-8 的文本被按 GBK 去解码结果满屏问号、百分号这个和字体没有任何关系你装再多字体也修不好。另一种是缺字字库文件里没有对应的字形或者系统找不到能渲染这个字符的字体于是显示成方框、圆点、空白。区分方法很简单在浏览器里看一段正常中文文本如果版面是空的、字符位置被占住但没有字形基本都是缺字体如果是变成一堆乱符号那是编码问题别在字体上浪费时间。日常大家说的“Ubuntu 装完没有中文字体”绝大多数是指第二种也就是系统里没有合适的中文字库或者有字库但 fontconfig 没有把它匹配到对应的字符区间。1.2 字体体系的基本概念Fontconfig、字体文件、应用调用链很多人习惯把字体文件直接看成“字体本身”这没错但 Ubuntu 里还有一层叫 fontconfig 的东西。你可以把它理解为“字体管家”或者“字体路由器”系统里装了一堆字体之后应用并不直接去扫描 /usr/share/fonts 目录而是通过 fontconfig 提供的库去查询“我要一个支持中文的 sans-serif 字体”然后 fontconfig 返回一个最合适的结果。这个机制有好处也有坏处。好处是应用开发不用关心字体文件具体叫什么、放在哪里坏处是当你“装了字体但没有更新缓存”“装了字体但配置了错误的语言优先级”“装了字体但把文件放在了一个 fontconfig 不扫描的目录”时应用照样找不到它。后面我讲的很多排查步骤本质上都是在顺藤摸瓜整条调用链。1.3 常见缺字体的三大场景根据我这些年折腾的经验Ubuntu 缺字体基本逃不出下面三种场景。场景典型表现原因刚装完系统中文显示方块桌面环境里有大量“□”系统默认未安装任何中文字库从 Windows 迁移原来的文档换了字体Office 类文档排版全变或某些字变成方框文档指定的字体如微软雅黑、宋体系统里没有服务器/容器用无头浏览器、报表工具出图生成的图片里中文全部是方框基础镜像或最小化系统没装字体也没有中文字库这三个场景的解决办法不一样。比如第一个场景最简单的做法是apt install fonts-noto-cjk第二个场景不仅要装字体还可能要配置 fontconfig 的优先级把相似风格的中文字体映射到文档指定的字体上第三个场景则要考虑镜像体积和使用场景有时候装几个核心字体包就够了不需要整个桌面环境。2. 装字体前的准备先确认你缺的到底是什么字体千万不要上来就apt install一长串包也不要网上随便找几个字体文件就往系统里塞。装完发现不生效、白占空间不说有时候还会引入奇怪的渲染问题。正确的顺序是先盘一下系统里现在有什么再决定要装什么。2.1 用 fc-list 命令摸清系统现有字体fontconfig 自带的fc-list是排查字体问题最重要的命令没有之一。它会把你系统当前所有能被 fontconfig 识别的字体都列出来包括字体全家名、样式和文件路径。# 查看系统里所有已识别的字体 fc-list # 只查中文字体 fc-list :langzh # 只查看某个字体的具体信息 fc-list | grep -i noto第一次跑fc-list :langzh的时候如果你发现结果里一个字体都没有那基本就实锤了系统里没有能被 fontconfig 识别为中文支持的字体。如果结果里有 Noto Sans CJK 但没有其他字体那就说明字库在但优先级或覆盖范围可能不对排查方向就完全不同了。除了fc-list还要学会用fc-match。它会告诉你“当应用请求某个字符集的某个风格时fontconfig 会返回哪个字体”。比如fc-match sans-serif -f %{family}\n fc-match serif -f %{family}\n fc-match monospace -f %{family}\n如果结果返回的不是你以为的那个字体说明 fallback 配置有问题需要调整优先级。2.2 字体文件格式与选择建议TTF、OTF、WOFF字体文件格式这块普通人最常见的担心是“我下的字体怎么是个 .ttc 或者 .otf到底能不能装”。其实 Ubuntu 的 fontconfig 对 TTF、OTF、TTC 都支持得非常好不需要转换。TTF 是最通用的 TrueType 字体OTF 是包含 PostScript 轮廓的 OpenType 字体很多高质量开源字体都用它TTC 是多个 TTF 打包在一个文件里的集合Windows 和 Linux 都能识别。需要注意的是尽量别用 WOFF/WOFF2 格式的字体来做系统安装。WOFF 是给 Web 用的压缩字体格式虽然 fontconfig 新版本能识别一部分但兼容性不如 TTF/OTF。我自己遇到过一次把网站下载的 woff2 字体强行改后缀放进字体目录结果 fc-cache 后完全识别不了最后只能老老实实去下 TTF。2.3 从哪下载靠谱字体版权与安全提醒字体的来源重点提醒两条第一优先从发行版软件源装也就是用apt install安装字体包这是最安全、最省事的方式。软件源里的字体包虽然数量有限但质量有保证更新也由包管理器统一管。第二需要下载字体文件时尽量去字体的官方网站、GitHub 官方仓库或者知名开源字体项目下载。不要从乱七八糟的网站下载来路不明的字体文件字体文件是可以嵌入恶意代码的不要觉得“只是几个字体文件而已”。还有一个版权问题很多商用字体比如微软雅黑、方正字体虽然你从别的 Windows 机器上拷过来就能用但这是有授权限制的。个人学习无所谓但放到公司服务器、对外系统里风险不小。公共场合和商业项目首选开源字体比如思源黑体、思源宋体、文泉驿这些字体授权宽松覆盖范围也广。3. Ubuntu安装字体的三种主流方法附实测命令字体文件到位之后安装方法其实就三类。按优先级来说我建议你在服务器或者生产环境里用“系统级安装”来保证一致性自己在本地桌面环境体验时用“用户级安装”也行都写在下面了。3.1 方法一用户级安装——只给自己用如果你只是想让当前登录用户在用某个软件时能多一种字体不需要 root 权限也不需要影响系统里其他用户那就放在用户字体目录。现代 Ubuntu 推荐以下两个目录# 方法1传统目录老系统常见仍可用 mkdir -p ~/.fonts # 方法2新规范目录推荐 mkdir -p ~/.local/share/fonts然后把字体文件拷贝进去。比如你下载了一个SourceHanSansSC-Regular.otfcp SourceHanSansSC-Regular.otf ~/.local/share/fonts/ fc-cache -ffc-cache -f是强制刷新字体缓存的意思。这一步非常关键很多新手装了字体不生效就是忘了刷新缓存。用户级安装的好处是干净、不需要 sudo哪天你想删直接删文件再跑一次fc-cache -f就行。但它的适用范围仅限于当前用户如果这个系统是多人共用的别人还是看不到你装的字体。3.2 方法二系统级安装——全用户共享如果这个 Ubuntu 是多人使用或者跑的是需要全系统统一字体渲染的服务比如 Chromium 无头出图、LibreOffice 转 PDF建议装到全局字体目录。推荐目录是/usr/local/share/fonts因为它不会和发行版自带的字体混在一堆系统升级时也基本不会被覆盖。sudo mkdir -p /usr/local/share/fonts/custom sudo cp SourceHanSansSC-Regular.otf /usr/local/share/fonts/custom/ sudo fc-cache -f注意子目录名称你自己定就行fontconfig 会递归扫描字体目录下的所有子目录。你完全可以用custom、my_fonts、或者直接按字体名分类。我个人的习惯是按用途分类比如chinese、mono、symbol这样以后维护的时候光看目录结构就知道装了什么东西。顺便提一下/usr/share/fonts是发行版仓库包默认安装的位置虽然也可以手动往里放文件但一般不推荐。手动放进去的文件可能在系统更新时被包管理器的操作覆盖或者你自己都不记得这个文件是哪来的了。同样的字体我应该优先用软件包方式安装只有软件源里没有的字体才手动放到/usr/local/share/fonts。3.3 方法三图形化字体管理器桌面上最直观的方式是装一个字体管理器比如 GNOME 桌面自带的 Fonts 应用或者第三方工具 Font Manager。sudo apt install font-managerFont Manager 能导入、删除字体切换系统字体还能预览同一字体的不同字重。它的本质操作还是把字体复制到对应的用户/系统目录然后刷新 fontconfig 缓存所以底层逻辑和上面命令行是一样的。如果你不喜欢敲命令用图形界面确实舒服。但说实话字体安装这件事在命令行下效率更高尤其是批量装字体时几个cp加一个fc-cache -f就结束了。3.4 别忘了 fc-cache刷新缓存的作用与原理这节我要单独拿出来强调因为它值得。你装完字体后应用不会立刻知道新字体存在。fontconfig 会在系统的几个目录里扫描字体并生成一个名为fonts.cache-*的缓存文件用来加速下次查找。当你新增或删除字体文件时缓存还停留在旧状态应用查询时拿到的还是旧结果。刷新命令有几种形式# 强制刷新所有字体缓存最常用 sudo fc-cache -f # 家目录和系统目录都刷新且显示详细日志排查时用 sudo fc-cache -fv # 只刷新某个目录 fc-cache /usr/local/share/fonts/custom刷新完之后再跑一次fc-list :langzh确认字体已经被识别。如果还是找不到说明文件格式有问题、目录没被扫描或者权限不对继续往下面排查。4. 实操案例一次性装好常用中文字体拯救“方块字”讲完通用方法我们落到最常用的场景装中文字体。刚装好 Ubuntu 的人十有八九都要干这事我在这里给你一套可以直接复制粘贴的方案。4.1 安装开源中文字体不仅文泉驿还有思源黑体Ubuntu 软件源里现成的、质量比较高的中文字体主要有这几个sudo apt update sudo apt install fonts-noto-cjk # 思源黑体的 Noto 版本覆盖简体、繁体、日文、韩文 sudo apt install fonts-wqy-microhei # 文泉驿微米黑体积小渲染清晰 sudo apt install fonts-wqy-zenhei # 文泉驿正黑 sudo apt install fonts-arphic-ukai # 楷体AR PL UKai sudo apt install fonts-arphic-uming # 明体AR PL UMing我个人的建议是fonts-noto-cjk是必装的它是 Google 和 Adobe 合作的开源字体思源黑体的 Noto 版本覆盖字符范围极广粗、中、细字号渲染都很均衡在现代桌面环境里的表现比其他老牌文泉驿字体好得多。fonts-wqy-microhei可以作为备选在小字号显示时它的表现非常稳。至于fonts-arphic-*一般处理旧文档、古籍排版时才会用到。这里有个经验可以分享一下Ubuntu 24.04 等新版本会把fonts-noto-cjk作为中文环境的一部分默认带上但如果你安装系统时选择了英文语言或者最小安装就很容易没有中文字库。不要手动花时间去找字体文件下载先检查源里的包是不是就够用了。4.2 配置字体回退顺序让系统知道缺字时找谁字体装完之后默认情况下优先级基本合理但如果 Linux 桌面想要更可控的字体渲染顺序或者想自定义“当某个字体找不到时去找哪个字体”就要调整 fontconfig 的配置。fontconfig 的配置文件目录是/etc/fonts/其中conf.d下有一堆配置链接local.conf是留给本地自定义的推荐位置。假设我想让系统在遇到“微软雅黑”这种文档字体时回退到 Noto Sans CJK SC可以写一个local.conf?xml version1.0? !DOCTYPE fontconfig SYSTEM fonts.dtd fontconfig alias bindingstrong familyMicrosoft YaHei/family prefer familyNoto Sans CJK SC/family /prefer /alias alias familySimSun/family prefer familyNoto Serif CJK SC/family /prefer /alias /fontconfig写完保存后记得sudo fc-cache -f。这种配置的意义在于很多从 Windows 拷过来的文档、HTML 模板里直接写死了 “Microsoft YaHei” 或 “SimSun”Linux 上没有这些字体如果没有配置回退规则应用会按自己的默认规律乱找有时候找到的字体不合适排版就变得很糟糕。加了回退规则后字体表现会稳定很多。如果你是开发者或者高频写文档的人我可以多说一句模拟“微软雅黑”回退是实际工作中最高频的需求之一尤其在对外的 Web 项目和 PDF 生成流水线里。上面那段配置可以直接用。4.3 服务器/容器无桌面环境怎么办最小化安装脚本比桌面更常见的一个场景是你在跑一个干净的 Docker 容器或者最小化 Ubuntu 服务器里面的应用要生成包含中文的图片、PDF 或者 HTML 截图。这时候没有桌面没有中文字库甚至 fontconfig 都可能没装全。直接的后果就是“中文全是豆腐块”。在 Dockerfile 里的最小化安装一般这样做RUN apt-get update \ apt-get install -y --no-install-recommends fonts-noto-cjk fontconfig \ apt-get clean \ rm -rf /var/lib/apt/lists/* # 检查是否能识别中文构建时验证 RUN fc-list :langzh | head -n 5如果你用的是 Alpine 基础镜像情况略有不同因为 Alpine 用的是 musl libc 和不同的包管理字体路径也不完全一样。这种时候我更建议直接换一个基于 Debian/Ubuntu 的镜像或确保 FontConfig 已安装再排查渲染问题。我自己就在容器里折腾过两次“intl 库齐全但中文全空白”的怪问题最后定位都是同一件事基础镜像里根本没有字体缓存。5. 常见应用里的“缺字体”问题与排查技巧字体装上是一回事应用认不认是另一回事。第 5 节收集了我在实际使用中遇到频率最高的几个场景以及对应的排查步骤。5.1 LibreOffice、WPS 显示成方框LibreOffice 打开 docx 或 xlsx 时显示方框十有八九是文档里内嵌指定的字体在系统里找不到。不要急着去下载那个商业化字体先看文档里到底用了什么字体。办法很简单在 LibreOffice 中打开文档查看字符样式或者直接把 docx 解压开看。docx 本质上是个 zip 包unzip 文档.docx -d /tmp/docx grep -o w:rFonts[^]* /tmp/docx/word/document.xml | head看到字体名之后在 fontconfig 里给它配置回退规则让文档指定的字体映射到系统已有的类似字体上。如果你实在需要原字体再考虑下载安装。WPS 的 Linux 版行为类似但 WPS 有自己的一套字体匹配逻辑有时候你系统装了字体WPS 还要重新启动一次才能识别这里不用重启系统重启 WPS 通常就够了。5.2 浏览器渲染异常网页指定了字体但系统没有浏览器缺字体的表现比较隐蔽网站通常会给字体列表指定多个 fallback 候选比如font-family: PingFang SC, Microsoft YaHei, sans-serif;。第一个字体 Linux 上没有浏览器会尝试第二个如果都没有就落到默认 sans-serif。如果你系统默认的 sans-serif 字体本身就不支持中文网页上的中文就会掉回一个随机字体甚至变成方块。这时候优先检查系统 sans-serif 字体的 fallback 链条fc-match sans-serif -f %{family}\n如果返回的不是你预期的中文字体说明优先级有问题。可以在local.conf中把 Noto Sans CJK SC 加到 sans-serif 的 prefer 里强制它优先匹配。另外浏览器自身也有字体设置面板如果你只想影响当前浏览器直接在设置里改字体优先级也可以但系统级配置更一劳永逸。5.3 命令行 Terminal 找不到 Powerline 字体这算是开发者的老朋友了。装了 oh-my-zsh、powerlevel10k 等主题后终端提示符会出现乱码或者特殊符号缺失这通常是因为没有安装 Powerline 字体。这个问题的关键不在于缺不缺失普通字体而是终端使用的字体里根本没有那些特殊图标字形。Ubuntu 上装 Powerline 字体最省事的方式是sudo apt install fonts-powerline然后修改终端首选项里的字体为 “MesloLGS NF” 或至少是某个包含 Powerline 符号的等宽字体。装完如果还乱码就检查终端里有没有启用自定义字体以及字体名称是否被正确加载。这个问题跟中文字体其实没有关系但症状看着很像“缺字体”我在这里也放出来帮你省点排查时间。5.4 字体冲突与权限问题的排查实录有时候字体明明装好了并且fc-list也能查到但某些应用就是渲染不对我一般会按下面这张表去排查。问题现象可能原因排查手段解决建议fc-list 查不到新字体目录不对/缓存未刷确认目录是否属于 fontconfig 扫描范围fc-cache -fv后复查移动文件到标准目录fc-list 能查到但应用识别不了应用缓存/进程复用旧配置重启应用必要时注销桌面重新登录不要重启系统没必要字体有多个字重但只识别一个拼接字体族未匹配fc-listgrep family 查看字体族名某个用户能看到字体别的用户看不到装在了用户级目录检查文件的权限和其他用户的家目录改为系统级安装特殊字符全部渲染成方框字体文件不含这些字形或字体不支持该 character 范围用fc-query查看字体覆盖范围换覆盖范围更大的字体如 Noto这里面最容易让人迷惑的是“字体文件名带中文”导致的麻烦。Linux 对 UTF-8 文件名支持很好但某些老工具或者跨进程场景会有兼容问题。我的习惯是安装字体时一律把文件名改成英文或拼音目录名也用英文。纯属省心不解释。6. 一条命令批量安装字体与自动化维护你自己要用的字体可能不止中文字体。代码里用 Fira Code办公文档里用 Noto Serif特殊图标需要 FontAwesome。一个个去下载、复制、刷新缓存太累了不如把所有需要的字体包写进一条命令里批量安装。6.1 常用字体包清单我整理了一个我几乎每台 Ubuntu 都会装的字体包清单作为参考你可以按需裁剪。sudo apt install -y \ fonts-noto-cjk \ fonts-noto-cjk-extra \ fonts-wqy-microhei \ fonts-wqy-zenhei \ fonts-arphic-ukai \ fonts-arphic-uming \ fonts-powerline \ fonts-font-awesome \ fonts-firacode \ fonts-liberation \ fonts-dejavu \ fonts-droid-fallback简单解释一下这里的几个包fonts-liberation是 Arial、Times New Roman 等字体的开源替代很多 LibreOffice 模板都会依赖它强烈建议装fonts-droid-fallback是一个覆盖多语言字形的 fallback 字体在浏览器和阅读器渲染混合语言文本时很管用fonts-firacode是编码用的等宽字体喜欢炫酷代码风格的可选。6.2 脚本化安装与维护技巧如果你的机器很多或者想保持多台机器字体环境一致建议把安装步骤写成一个简单脚本。这个脚本还可以做成幂等的重复跑也不会出问题。#!/usr/bin/env bash set -euo pipefail FONT_DIR/usr/local/share/fonts/custom sudo mkdir -p $FONT_DIR # 安装系统源字体包幂等 sudo apt update sudo apt install -y fonts-noto-cjk fonts-wqy-microhei fonts-wqy-zenhei fonts-powerline fonts-liberation # 如果你的字体文件放在当前目录下的 fonts/ 文件夹里 if [ -d ./fonts ]; then sudo cp ./fonts/*.ttf ./fonts/*.otf $FONT_DIR/ 2/dev/null || true fi # 统一刷新缓存 sudo fc-cache -f echo Fonts installed successfully.这样一个脚本放到 Git 仓库里每次新装系统或初始化新环境拉下来跑一遍就完事。对于要维护一大堆 Ubuntu 服务器的同学这比你手工装可靠得多。另外如果你管理的是几十台机器还可以把字体文件放到内网 HTTP 服务器或对象存储上脚本里加个下载步骤就行我这里就不展开了。7. 最后送几个我认为最实用的经验7.1 字体安装后不生效的常见坑“按步骤装完还是不生效”是“ubuntu 安装缺失字体”这个话题下被问得最多的问题。综合我自己的经验常规的坑有三个。第一个是忘记刷新缓存这个前面说了很多次你敲完cp之后一定要跟着fc-cache -f这俩是绑定的动作。第二个是装到了错误的目录尤其是桌面用户在~/.fonts和~/.local/share/fonts之间纠结其实两个目录都可以但新系统推荐用~/.local/share/fonts。第三个是应用进程还持有旧字体配置比如某些 WPS 版本、Chromium 渲染进程你改了字体之后必须完全退出进程再重新打开否则它还是拿的旧缓存。有个比较容易忽略的细节是不是所有“方块”都能靠装字体解决。如果你在网页里看到一个小方框它还可能是浏览器渲染某个图标字体icon font时没有加载对应的 Web 字体这时候跟系统字体没关系你装再多系统字体也没用。用鼠标选中那个方块看看字体名再判断是不是系统字体问题。7.2 关于字体版权多说一句老话长谈但要再叮嘱一下。公司项目、对外产品、公开部署的系统里一旦涉及字体尽量全部换成开源授权字体比如 SIL Open Font License 的 Noto、文泉驿或者 OFL 协议下的其他项目。不要觉得“拷贝一个字体文件”很小字体授权是真实的商业风险。个人桌面怎么折腾都行但如果你负责的是有商业性质的服务还是按开源规范来。我个人在实际操作中的体会是字体问题很少是“一种方法通吃”就能永久解决的。桌面系统、办公软件、无头浏览器、Docker 镜像每个环境都有自己的细节但底层检查链路高度统一——看 fontconfig 有没有扫到、缓存有没有刷新、应用有没有重新读取。把这几个环节理顺Ubuntu 上 90% 的字体问题都能在你自己的电脑上解决掉。希望这篇文章能帮你少走点弯路。