从源码到字体:霞鹜文楷UFO格式与fontmake构建全流程解析
你是否曾好奇那些优美的开源字体是如何从设计文件转化为可安装的字体文件?本文将以热门开源中文字体霞鹜文楷为例,带你深入了解UFO(Unified Font Object)格式的字体源码结构,掌握使用fontmake工具将设计文件转换为TTF字体的完整工作流,让你轻松上手字体构建过程。
项目概述与准备工作
霞鹜文楷(LxgwWenKai)是一款基于日本FONTWORKS公司开源字体Klee One开发的中文字体项目,支持多种字重和使用场景。其字体源码采用UFO 3 ZIP格式(.ufoz)存储,位于项目的sources目录下。
环境依赖安装
构建字体前需安装以下工具:
通过pip命令安装:
pip3 install fontmake fonttools
源码文件结构
项目核心源码文件位于sources/目录,包含:
- UFOz格式源文件:如LXGWWenKai-Regular.ufoz
- 辅助脚本:extract_ufoz.py(解压UFOz文件)和fix_mono.py(调整等宽字体属性)
UFO格式解析:字体设计的数字容器
UFO(Unified Font Object)是一种开源的字体源码格式,它将字体的轮廓、度量和元数据存储为人类可读的XML文件和PNG图像,便于版本控制和协作开发。
UFOz文件解压
由于fontmake暂不直接支持UFOz(UFO3 ZIP压缩格式),需先使用extract_ufoz.py解压:
import zipfile
import os, sys
ufozName = sys.argv[1]
with zipfile.ZipFile(ufozName, 'r') as zip_ref:
zip_ref.extractall(".") # 解压到当前目录
执行解压命令:
python3 sources/extract_ufoz.py sources/LXGWWenKai-Regular.ufoz
解压后得到UFO格式文件夹,包含以下关键文件:
glyphs/:存储每个字符的轮廓数据(.glif文件)metainfo.plist:字体元数据fontinfo.plist:字体全局设置features.fea:OpenType特性定义
UFO文件夹结构示例
LXGWWenKai-Regular.ufo/
├── glyphs/ # 字符轮廓数据
│ ├── .notdef.glif # 缺字符号
│ ├── space.glif # 空格字符
│ └── ... # 其他字符文件
├── fontinfo.plist # 字体基本信息
├── features.fea # OpenType特性
└── metainfo.plist # UFO格式元数据
fontmake构建流程:从设计到字体文件
fontmake是一款强大的字体编译工具,能将UFO等源码格式转换为TTF、OTF等最终字体文件。霞鹜文楷项目提供了自动化构建脚本,位于sources/目录下。
构建脚本工作流程
项目的构建脚本(build.bat/build.sh)实现了以下步骤:
- 解压UFOz文件为UFO文件夹
- 使用fontmake将UFO转换为TTF字体
- 调整等宽字体属性(针对Mono版本)
- 输出TTF文件到fonts/TTF/目录
手动执行构建步骤
1. 解压UFOz文件
python3 sources/extract_ufoz.py sources/LXGWWenKai-Regular.ufoz
2. 生成TTF字体
fontmake -u LXGWWenKai-Regular.ufo -o ttf --output-dir fonts/TTF/
3. 调整等宽字体属性
fix_mono.py脚本用于设置等宽字体的平均字符宽度和固定间距属性:
from fontTools.ttLib import TTFont
font = TTFont("fonts/TTF/LXGWWenKaiMono-Regular.ttf")
font["OS/2"].xAvgCharWidth = 500 # 设置平均字符宽度
font["post"].isFixedPitch = 1 # 标记为固定间距字体
font.save("fonts/TTF/LXGWWenKaiMono-Regular.ttf")
执行调整命令:
python3 sources/fix_mono.py fonts/TTF/
构建成果
成功构建后,可在fonts/TTF/目录下找到生成的字体文件,包括:
- LXGWWenKai-Regular.ttf:常规字重
- LXGWWenKai-Bold.ttf:粗体
- LXGWWenKaiMono-Regular.ttf:等宽版本
字体效果预览
构建完成的霞鹜文楷字体具有优美的手写风格,适用于代码展示、文档排版等多种场景:
常见问题与解决方案
构建失败:UFOz文件无法解压
确保Python的zipfile模块正常工作,或手动解压UFOz文件:
unzip sources/LXGWWenKai-Regular.ufoz -d LXGWWenKai-Regular.ufo
等宽字体宽度不一致
运行fix_mono.py脚本修复:
python3 sources/fix_mono.py fonts/TTF/
字体文件过大
可参考霞鹜文楷轻便版项目,剔除不常用字符以减小文件体积。
总结与扩展
通过本文的学习,你已掌握从UFO源码构建霞鹜文楷字体的完整流程,包括UFOz文件处理、fontmake编译和字体属性调整。这一流程同样适用于其他基于UFO格式的开源字体项目。
如需进一步探索字体开发,可研究项目的字符添加记录和字形调整历史,或尝试使用FontForge等工具对字形进行修改,创造属于自己的字体变体。
霞鹜文楷项目持续维护更新,欢迎通过项目GitHub仓库参与贡献或反馈问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






