Linux服务器默认只安装少量基础字体,绝大多数业务场景都需要手动补装中文字体和特定格式字体,用fc-list命令可以快速查看当前系统已安装的所有字体。
linux服务器查看已安装字体命令,一条命令搞定
很多人在服务器上遇到图片拼接文字变方块、PDF报表中文乱码时,第一反应是代码写错了,其实排查步骤很简单:先确认服务器里到底有没有这个字体。
用fc-list查看字体全家福
Linux服务器上最常用的字体查看命令是fc-list,它属于fontconfig工具包,执行后,每行输出一个字体的完整路径、字体族名和样式。
fc-list
如果命令提示command not found,说明系统还没装fontconfig,Debian/Ubuntu系用sudo apt install fontconfig,CentOS/RHEL系用sudo yum install fontconfig。
按字体族名和文件名过滤
服务器字体数量动辄几百个,肉眼翻找不现实,用fc-list配合过滤条件,秒出结果。
# 查看所有中文字体 fc-list :lang=zh # 查看包含“Song”或“Hei”的字体 fc-list | grep -i "song|hei" # 只查看字体族名 fc-list : family
其中lang=zh这个参数非常实用,直接告诉你有多少字体支持简体中文,如果输出为空,说明服务器没有中文字体,后续操作才能渲染出中文。
验证字体文件是否真实存在
有时候fc-list列出了字体,业务程序仍然报错,这种情况多半是字体文件路径不在程序搜索范围,用fc-list加上文件名查看具体路径:
fc-list | grep "arial"
然后用ls -l确认文件大小是否正常,0字节的字体文件通常是上传中断或磁盘故障导致的,直接重新上传即可。
linux服务器中文字体安装方法,解决乱码和方块
服务器上没中文字体,最典型的症状就是网页上显示方块、PDF导出乱码、验证码图片生成空白,下面按安装方式拆解。
包管理器安装,省心省力
主流Linux发行版都维护了中文字体包,安装后自动进入系统字体目录。
| 发行版 | 常用包名 | 安装命令 |
|---|---|---|
| Debian/Ubuntu | fonts-noto-cjk |
sudo apt install fonts-noto-cjk
|
| CentOS/RHEL | google-noto-sans-cjk-fonts |
sudo yum install google-noto-sans-cjk-fonts |
| Fedora | google-noto-sans-cjk-fonts |
sudo dnf install google-noto-sans-cjk-fonts |
安装完成后执行fc-cache -f刷新字体缓存,再用fc-list :lang=zh验证,行业共识认为,Noto CJK是目前Linux生态兼容性最好的中文开源字体,覆盖简体、繁体、日文和韩文。
手动上传字体文件,适合内网环境
内网服务器无法访问外网仓库时,可以从开发机上传字体文件,先创建目录,再拷贝文件,最后刷新缓存。
sudo mkdir -p /usr/share/fonts/custom sudo cp ./yourfont.ttf /usr/share/fonts/custom/ sudo chmod 644 /usr/share/fonts/custom/ sudo fc-cache -f
注意权限必须设置成644,否则其他用户无法读取,这里推荐使用.ttf或.otf格式,兼容性最好,.ttc集合格式在旧版fontconfig中可能无法正确识别。
业务应用专属字体目录
有些Java应用(比如基于OpenPDF、Apache POI的报表系统)不走系统字体库,而是读取应用内部固定目录,比如/app/resources/fonts,此时把字体文件扔进该目录,重启应用就能生效,网上很多linux服务器字体乱码怎么解决的教程都只讲系统层面,忽略了应用层面,这就是为什么改了系统字体后应用还是乱码。
服务器字体缺失怎么定位,从日志到业务排查
乱码不一定都是系统缺字体,也可能是编码转换问题,定位流程比直接装字体更重要。
三步定位法
- 查看程序日志,Java应用出现乱码时,日志常伴有
UnknownHost或invalid character提示;PDF生成库会直接抛出FontNotFoundException。 - 检查字体路径,如果程序使用自定义字体路径,先用
ls确认路径是否存在,再和系统字体库路径对比。 - 测试渲染结果,生成一个包含中文的测试页面或PDF,然后用
pdffonts查看嵌入字体列表,确认实际用到的是什么字体。
常见误判场景
- PDF打开正常,在服务器端提取文本乱码,通常是PDF没有嵌入字体,和服务器字体库无关。
- 网页显示正常,生成的图片上文字变成豆腐块
,这多半是图片处理库(如GD、ImageMagick)没有正确配置字体路径,而不是系统缺字体。
- 容器环境,Docker容器内即使宿主机有字体,容器里也看不到,需要单独在Dockerfile中安装字体。
Docker容器字体补充技巧
在构建镜像时加入字体层,这是很常见的做法,以openjdk:17-jdk为基础镜像为例:
RUN apt-get update
&& apt-get install -y fonts-noto-cjk
&& rm -rf /var/lib/apt/lists/
构建后进入容器执行fc-list | wc -l,确认字体数量,有人习惯直接COPY宿主机的字体目录进容器,也能用,但镜像体积会变大不少。
定制你的linux服务器字体清单,只留业务需要的
一台业务普通的Linux服务器,字体数量通常在100到300个之间,包管理器默认安装的字体包含很多你根本用不到的字符集,比如蒙古文、藏文、阿拉伯文,按需瘦身可以减少攻击面,也让fc-list输出更加清爽。
查看当前字体占用磁盘大小
fc-list | awk '{print $1}' | sort -u | xargs du -h | tail -20
这条命令会按文件路径列出每个字体的大小,方便你判断哪些字体文件异常巨大,多数情况下,Noto CJK的每个weight文件在15MB到25MB之间,如果出现100MB以上的字体,大概率是误装了超大字符集。
禁用不想使用的字体
不需要删除文件,只需改一下配置就能让字体“隐形”,进入/etc/fonts/conf.d/,写一个屏蔽配置文件。
sudo nano /etc/fonts/conf.d/50-exclude.conf
写入:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<selectfont>
<rejectfont>
<glob>/usr/share/fonts/your-font-dir/</glob>
</rejectfont>
</selectfont>
</fontconfig>
保存后执行fc-cache -f,再fc-list里就看不到这些字体了,这个操作在大量使用中文字体的服务器上很好用,比如针对某个linux服务器字体安装包推荐里带的英文字库,如果不做屏蔽,会自动回退到麻烦的渲染路径。
备份字体清单辅助资产盘点
运维做服务器交接时,把字体清单导出来存进文档,下次排障能少花半小时。
fc-list > linux-server-fonts-backup-$(date +%Y%m%d).txt
配合文件名和安装来源,还能统计出每类字体占比,下面是一个简化的表格示例。
| 字体类别 | 典型文件 | 常见用途 |
|---|---|---|
| 中文黑体 | NotoSansCJK-Bold.ttc | 标题、UI按钮 |
| 中文宋体 | NotoSerifCJK-Regular.ttc | 正文、PDF打印 |
| 英文字体 | DejaVuSans.ttf | 日志、代码 |
| 图标字体 | FontAwesome.ttf | 前端图标渲染 |
Q&A:linux服务器字体常见问题
为什么fc-list命令找不到,但程序可以正常显示文字?
程序可能使用了X11核心字体后端,或者直接调用了/usr/share/fonts下的文件,而fc-list只列出fontconfig识别的字体,先检查程序配置里是否写死了字体路径,再确认fc-list版本和fontconfig库是否一致,fc-list -v可以查看详细信息。
线上服务器想安装微软雅黑,怎么操作最稳妥?
直接把msyh.ttf上传到/usr/share/fonts/msyh/目录,设置644权限后执行fc-cache -f,需要注意微软雅黑是商业字体,不能用于对外分发或嵌入软件产品,只建议在内部服务器测试环境使用,如果业务需要商用授权,推荐使用思源黑体,渲染风格接近且无授权风险。
每次重启服务器后定制字体就失效,是什么原因?
检查字体文件是否放在/tmp或/var/run这类临时目录,重启后会被清理,正确做法是放入/usr/share/fonts或/etc/fonts/fonts.conf配置的持久化路径,云服务器用户还要确认初始化脚本有没有覆盖/etc/fonts目录,比如简米云或酷番云的初始化组件偶尔会重置配置,需要把字体安装步骤写进启动脚本才能根治。
Linux服务器上的字体管理没有想象中复杂,先用fc-list摸清现状,再按业务需求补充中文字体和常用英文字体,最后用配置把不需要的字体屏蔽掉,整个过程从查看、安装到定制,完全可以控制在半小时内完成,下次再遇到乱码,先别急着改代码,执行一条fc-list :lang=zh看看服务器里到底有没有这个字体的底气。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/734077.html




