首页/新闻资讯/正文详情

FontForge 常见问题深度解析:从字体编辑、格式转换到跨平台安装实战

发布时间:2026/9/27 21:25:22 来源:云帆数科 栏目:资讯中心
FontForge 常见问题深度解析:从字体编辑、格式转换到跨平台安装实战
桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载FontForge 是一款面向 Windows、macOS 与 GNULinux 的免费自由开源字体编辑器。本文以官方 FAQ 文档doc/sphinx/faq.rst为骨架逐一拆解用户最常遇到的疑问为什么需要字体编辑器、字体点大小与 em 单位如何理解、如何在不同操作系统上安装字体、如何进行格式转换、Hinting 指令如何处理、以及大量编辑器内部的怪异行为。读完本文你将系统掌握 FontForge 的核心概念、跨平台字体安装流程与常见故障的排查思路并能在实际项目中直接复用这些操作步骤。关于 FontForge 本身的疑问为什么还需要一个字体编辑器面对字体已经够多了的疑问FAQ 给出了一个明确的回答字体是艺术品如同水彩画永远不会够多。从实用角度讲仍存在大量未被满足的需求拉丁字体很多但希腊文、西里尔文、印度系文字、泰文、中日韩等字体的高质量作品相对稀少研究古文字系统的学者常常需要自行设计字体而即便是现有字体也可能缺少连字ligature、缺少带音调符号的字形、缺乏配套的西里尔文或希腊文字形。除了创建与修改字体FontForge 还被广泛用于格式转换、从字体文件中提取信息、以及在不安装字体的情况下直接预览字体效果。为什么用 C 写而不是 C作者坦言自己并不认同面向对象实践认为 C 过于复杂且难以调试。文中列举了几条个人理由C 程序语义难以完整确定编译器可自由生成临时对象而临时对象的构造/析构可能带来副作用外部构造函数执行顺序不确定单步调试时经常跳入大量意外的内联过程调用以及各编译器行为存在细微差异。作者曾在 1987–1994 年间为 Green Hills Software 编写过 C 前端属于基于长期实践的判断而非偏见。这一选择在仓库中同样可见核心字体引擎如 fontforge/splinefont.c、fontforge/tottf.c、fontforge/parsettf.c以 C 为主仅在 GUI 绑定、脚本桥接等少量位置使用 C如 fontforge/python.cpp。为什么采用 BSD 许可证而不是 GPL作者的立场非常直白我不喜欢强迫别人接受限制。BSD 许可证的核心诉求只有两点——不要起诉我如果用了我的代码请保留版权声明。作者认为 GPL 将限制强加于人而他希望 FontForge 被自由使用、修改甚至被嵌入其他项目。文中也提到其 OpenType 代码曾被某些 TeX 包借鉴作者也从其他软件包借鉴过校验和生成代码——这种互助正是开源生态的价值所在。为什么在运行时动态加载库而不是静态链接作者不喜欢依赖下载一个包却被迫再装五六个依赖包是不可接受的。因此 FontForge 尽量自己实现功能并将二进制包整体发布对于不得不使用的外部库则采用运行时dlopen动态加载——在真正需要时才加载。例如用户从不查看 SVG 字形就不需要 libxml2从不导入 JPEG 图像就不需要 libjpeg。这样既加快了启动速度又保证了缺失某个库时其余功能照常工作。为什么没有路线图作者坦承自己不这样思考不预先规划而是带着模糊方向边探索边前进。文中以 Python 脚本支持为例描述这种演进加入 Python 后随之诞生了用户自定义导入/导出格式的机制然后是启动脚本、事件脚本、自定义菜单项最终甚至可以把 FontForge 作为库嵌入 C 程序。许多功能来自用户的真实需求而不是计划表。字体的基本概念点大小、em 单位与行间距什么是12 点字体一个字体是 12 点大小当两行相邻不加行距文本的基线距离为 12 点时。点大小并非由任何字形的大小决定——金属活字时代点大小对应的是承载该字体的金属字模slug的高度。因此点大小并不是衡量字形的绝对尺寸有些字体为音调符、升部或降部预留更多空间实际字形会显得更小。传统上英美使用 pica 点1/72.27 英寸欧洲使用 didot 点1/67.54 英寸——欧洲点稍大恰好为带音调符号的欧洲语言留出空间。什么是 em 单位内部单位当字形实际被绘制时其大小取决于 em 大小em-size。例如一个长度 500 内部单位的 dash 字形若字体 em 大小为 1000 单位绘制在 12 点时字形长度为 500/1000 × 12 6 点在 72 dpi 屏幕上即 6 像素。em 大小可通过Element → Font Info → General设置通常为 1000 或 2048其含义是排版升部与降部之和金属活字时代即字模高度、基线到基线的距离。FontForge 内部即以该坐标系显示轮廓字形。如何设置字体行间距这取决于字体类型、目标操作系统乃至运气Type1 字体无法直接设置行间距应用通常依据字体包围盒bounding box推算这是常见但糟糕的做法。TrueType/OpenTypemacOS行间距由 hhea 表的 ascender/descender 决定而它们又被设置为字体包围盒值。可通过Element → Font Info → OS/2 → Metrics控制。Windows规范要求使用 OS/2 表中的 Typo Ascent/Typo Descent两者之和应为 em 大小。但多数 Windows 应用并不遵循该规范而是基于 Win Ascent/Descent 计算行距——这些值本应只定义裁剪区域。如果 GPOS 查找可能把字形移出包围盒如 mark-to-base 定位裁剪区域应大于包围盒。微软为此在 OS/2 表中加入了一个冗余位即 OpenType 中的 UseTypoMetricsFontForge 中对应Element → Font Info → OS/2 → Metrics → Really Use Typo Metrics。Linux没有统一共识应用可能采用上述任意一种方案。FAQ 进一步指出现代字体常含多种文字系统各系统行距需求不同英语几乎不用音调符号可排得更紧密德语等语言则需要更多空间。与其设置一个全局行距不如使用 OpenType BASE 表按脚本、语言和激活特性如 mkmk 特性增加行距分别指定。如何标记等宽字体你不需要显式标记。只需保证字体中所有字形具有相同宽度FontForge 会自动将字体标记为等宽。若错误标记某些光栅化器会给出奇怪结果。注意这里的所有字形包括 Unicode 规定宽度应为 0 的字形——微软建议用 GPOS 完成组合重音并将任何标记重音字形的步进宽度设为 0。如需手动设置 Panose 值Element → Font Info → OS/2 → Panose可将 Proportion 字段设为 Monospaced但这只是必要条件而非充分条件。若不确定是否所有字形宽度一致可用Element → Find Problems → Random → Check Advance检查。非整数坐标安全吗FontForge 允许以非整数坐标编辑。答案取决于输出格式TrueType只能表达整数坐标生成时所有坐标会被取整曲线产生轻微形变。若需更高精度可将 em 大小改为 8096。PostScriptType1、PostScript OpenType、Type2 等可以表达非整数坐标但会显著增大文件体积Type1 比 Type2 更占空间。FontForge 默认同样取整但可在 Generate Options 对话框中关闭取整——关闭后文件更大但更精确。OpenType PostScript 字体的 em 大小通常被应用假定为 1000因此不建议为 OpenType 输出修改 em 大小。这也解释了 FAQ 中为什么 OpenType 字体不比 .pfb 文件小多少的疑问未在保存前取整时FontForge 会使用定点数fixed point存储坐标占用远超普通整数。字体的法律与许可问题修改字体合法吗合乎道德吗法律因国家而异。FAQ 给出如下要点与指南先查看随字体提供的许可协议TrueType/OpenType以及潜在 CID-keyed 字体在 OS/2 表中有 FSType 字段允许设计者限制他人对字体的操作。若该字段禁止修改FontForge 会要求你确认持有优先于该字段的协议美国字体设计本身法律保护有限字母表是公共的但设计师可申请设计专利若获批准保护 14 年不可续期字体程序PostScript 或 TrueType 文件不包括位图文件可受版权保护字体名称可注册商标英国存在类似版权的design right保护设计 5 年可注册续期最多 5 次至 25 年欧盟存在欧盟设计权具体细节与各国法律如英国设计权的交互不明确加拿大字体设计可注册为工业设计保护期约 15 年。作者明确提示最终结论请咨询律师。开源字体该用什么许可证通用开源软件许可证见 Open Source Initiative 列表通常不能满足字体设计的特定需求。FAQ 推荐两种专为字体设计的许可证SIL Open Font LicenseOFL——作者明确推荐并提供非官方翻译合集供非英语用户理解意图Bitstream Vera 字体许可证。GPL 也常被用于字体但需注意其条款与字体分发的适配问题。这一话题与仓库中 desktop/org.fontforge.FontForge.appdata.xml.in 及根目录 COPYING.gplv3、LICENSE 等许可证文件直接相关——FontForge 自身是自由软件但用 FontForge 生成的字体可以选择任何合适的许可。系统要求、内存与稳定性最低要求是什么FontForge 主要受内存限制屏幕空间也可能是瓶颈处理几百个简单字形如拉丁字母表的字体192MB 绰绰有余严肃编辑 CJK 字体512MB 处于可用性下限。必须配备彩色或灰度显示器黑白显示器不够用。系统版本方面Windows 版基于 msys2/mingw-w64 构建最低支持版本取决于依赖库写作时为 Windows 7 及以上macOS 版通过 Homebrew 构建支持最近的三个大版本写作时为 macOS 10.13 High Sierra 及以上。为什么 FontForge 占用那么多内存字体文件格式为体积小、易于光栅化而设计不适合直接编辑。FontForge 加载字体时会将其展开为更直观、更易编辑的内部表示——功能强大但占用大得多。SFD 文件之所以庞大正因为它就是这个展开格式的 ASCII 文本表示其设计目标是可读而非紧凑。重写内存表示理论可行但工作量巨大。内存耗尽、系统崩溃怎么办FontForge 在内存分配失败时会检查并尝试释放部分内存块虽然作者坦言从未见过这段代码被触发。实用对策有两个使用Edit → Remove Undoes清除与字形关联的撤销历史通过File → Preferences → Editing → UndoDepth限制每个字形存储的撤销步数。为什么 FontForge 有时不稳定作者坦承自己在 QA 上投入不足这是已知问题并欢迎志愿者参与测试工作。字体安装实战跨平台操作指南Unix 与 X Window 系统轮廓字体与 fontconfig许多程序包括 FontForge 自身通过 fontconfig 查找字体安装方式很简单——把文件复制到~/.fonts目录即可。位图字体与原生 X11将字体放入指定字体目录构建 X 所需的数据结构并加入字体路径。以安装 BDF 字体frabnuts-13.bdf为例$ mkdir my_fonts $ mv frabnuts-13.bdf my_fonts $ cd my_fonts $ bdftopcf frabnuts-13.bdf frabnuts-13.pcf $ mkfontdir $ xset fp pwd每次启动 X 后需要重新声明字体位置把xset fp /home/me/my_fonts加入.xsession或等价文件中。PostScript 字体生成 .pfb二进制 PostScript文件将 .pfb 与 .afm 一起放入字体目录并运行type1inst。它可能抱怨字体没有 foundry 或编码不对——可以忽略或手动编辑 fonts.scale或修正字体版权信息后在 type1inst 中补充 foundry。TrueType 字体将 .ttf 移入字体目录并运行 mkttfdir 与 mkfontdir。注意 mkttfdir 几乎总会抱怨不识别 FontForge 生成的字体 foundryPFED可安全忽略如介意可在 ttmkfdir.c 第 936 行加入{ PFED, FontForge }。部分 X 发行版如 RedHat依赖 X 字体服务器而非 X server 本身此时用 chkfontpath 而非xset fp添加目录并确保字体目录及父目录对 world 可读。KDE可使用 kfontinst 工具自动完成配置作者在 0.9.2 版本上体验时需以 root 运行。TeXTeX 有自己独立于平台的字体安装体系详见 FAQ 中关于 TeX 安装经验的章节。Windows将 TrueType 字体拖入\Windows\Fonts目录即可安装可能需要设置可执行权限位。两条重要警告不要直接把字体生成到\Windows\Fonts目录——这往往不生效至少在 XP 上如此。应生成到其他目录再拖拽安装。若使用 Type1 字体需安装 Adobe Type Manager 并按其说明操作旧系统Windows 2000 之前安装 OpenType 字体同样需要 ATM新系统与 TrueType 安装方式一致。Mac OS 9Mac 将字体存于资源分叉resource fork并包裹在自己的头结构中与其他平台不兼容。FontForge 可通过 macbinary 编码创建资源分叉。编辑 Mac 字体的完整流程在System Folder:Fonts中找到文件复制到 Unix 机器用 Fetch 并指定 macbinary 格式或用 binhex 等工具在 FontForge 中打开、编辑以 macbinary 格式保存复制回 MacFetch 会自动解开 macbinary 包装放回系统文件夹。注意要么替换原字体文件要么在 FontForge 内重命名字体并对 PostScript 字体赋予新的唯一 ID。告诫PostScript 字体在 Mac 上若无至少一个位图字体相伴则不可用——生成 PostScript 字体时务必同时生成 NFNT其中含 FOND。Mac 对 PostScript 文件名很挑剔依据 PostScript 字体名变换而来见 Adobe Technical Note 0091字体名按大写字母分块首块可带四个小写字母后续块只能带两个连字符消失。如 TimesBold → TimesBolHelvetica-BoldItalic → HelveBolIta。Mac OS XOS X 字体放在顶层Library/Fonts默认/Mac OS X/Library/Fonts/、System/Library/Fonts或用户目录~/Library/Fonts。资源字体解开 macbinary 包装的或 dfont 均可也可直接使用 ttf/otf。老式 NFNT 位图资源在 10.2 上无法使用位图字体需包装进 ttf 或 sfnt但使用资源型 Type1 字体时系统仍要求先有一个无用的位图字体存在。如何编辑 Mac 字体OS 9 及更早版本传统上 Mac 字体存于资源分叉其他机器没有该概念。macbinary 与 binhex 可将 Mac 文件打包为单一文件FontForge 能读取这两种格式并提取 PostScript 或 TrueType 字体也能以 macbinary 输出macbinary 更简单故只支持这一种输出格式。OS X可直接运行 FontForge能直接编辑老格式资源字体与 .dfont 数据分叉字体也支持普通 .otf/.ttf。如何创建 Mac 字体族Snow Leopard10.6及之后先在 FontForge 中打开字体族的所有成员然后File → Generate TTC比旧方法简单得多。Leopard10.5及之前使用File → Generate Mac Family创建字体族。族内所有字体必须具有相同 Family 名。FOND 资源源自 1980 年代初的计算机字体技术只支持 Bold、Italic、Condense、Extend、Underline、Shadow、Outline 的组合Extend 与 Condense 不能同时出现不支持 Black、DemiBold、Light、Thin 或 Extra-Condensed。ATSUI 下一族由同一资源文件中 FamilyName 相同的所有字体构成。实践中 Apple 在同一文件放置多个 FOND各含一个相关子族例如含 Regular/Bold/Italic/Bold-Italic/Condense/Condense-Italic 的族再为 Oblique、Light、Light-Italic 单独设置 FondNameElement → Font Info → Mac并将 Light 变体的 Mac Style 设为 Regular、Light-Italic 设为 Italic——即忘掉 Light因为 FOND 处理不了。完成设置后Generate Mac Family会把所有字体放入合适的 FOND 并合并到一个文件中。为什么 ATM 在我的 Mac 字体上不工作确保生成字体时使用 Macintosh Latin 编码。这是 ATM 的局限FontForge 无能为力若以其他编码生成Mac 默认强制 PostScript 字体使用 Macintosh Latin 编码虽有关闭机制但关闭后 ATM 将完全失效。为什么字体在 Windows 上装不上常见原因之一Windows 有时要求字体有对应语言的名称如 SJIS 字体需日文条目。到Element → Font Info → TTF Names添加相应语言字符串。另一可能见为什么 FontForge 的字体在某些 Windows 机器上装不上。2009 年的一个 Windows 安全补丁拒绝安装 name 表大于 5K 的字体——常因字体中嵌入了完整许可证文本所致。从其他机器复制字体时确保设置了可执行权限位cygwin 下chmod x foo.ttf。为什么生成 OpenType 字体后 Windows 拒绝安装Apple、微软与 Adobe 对 Open/TrueType 格式的规范存在分歧。FontForge 的 Generate Font Options 对话框中有[] Apple复选框为 Mac 生成字体时勾选为 Windows通常 Unix 也一样生成时取消勾选。已知差异包括NAME 表中的 PostScript 名称条目、位图字体表名、缩放引用的存储方式以及高级排版表完全不同。为什么带 OpenType 表的 TrueType 字体在 Windows 上显示 TT 图标而非 O 图标Windows 依据字体是否包含 DSIG数字签名表来判定 O 图标。FontForge 本身不生成数字签名但可以创建不含签名的 DSIG 表这足以让 Windows 满意。格式转换实战轮廓字体互转最简单的通用流程File → Open打开现有字体然后Element → Generate Fonts生成目标格式。PostScript 格式互转如 pfb → otf仅此即可。TrueType二次样条ttf→ PostScript三次样条otf/pfb若要更高质量File → Open打开 TrueType 字体Element → Font Info → Layers勾选 All layers cubicOKEdit → Select → Select AllElement → Simplify → SimplifyHints → Auto HintElement → Generate FontsPostScript三次样条→ TrueType二次样条File → OpenElement → Font Info → Layers勾选 All layers quadraticOKEdit → Select → Select AllHints → AutoInstrElement → Generate Fonts位图格式互转、轮廓转位图、位图转轮廓位图 → 位图打开位图字体用Element → Generate Fonts生成目标格式。轮廓 → 位图加载轮廓字体用Element → Bitmaps Available生成所需尺寸的位图 strike此过程称光栅化小像素尺寸下很难做好。建议在位图窗口Window → Open Bitmap Window检查结果并随手修正完成后在 Generate Fonts 中关闭轮廓生成、选择位图格式。位图 → 轮廓除非是很大的位图字体如 TeX 字体否则效果不佳。流程先安装 potrace 或 autotrace文档见 doc/sphinx/techref/autotrace.rst 相关章节→ 新建字体 →File → Import导入位图务必勾选[] Into Background→Edit → Select → Select All→Element → Autotrace→Element → Add Extrema→Element → Simplify→ 人工清理 →File → Generate Fonts。AAT 与 OpenType 互转AAT → OpenType基本自动完成。加载 Apple 字体在 Generate 的 Options 对话框中勾选[*] OpenType。FontForge 会转换 Apple feature/setting 与 OpenType feature 匹配的所有非上下文特性包括非上下文连字尽管它们位于上下文格式中。详细信息见 doc/sphinx/techref.rst 中 gposgsub 章节。OpenType → AAT同样基本自动。加载 OpenType 字体Generate 时勾选[*] Apple。部分上下文 OpenType 表可转换与 Apple feature/setting 匹配的非上下文特性也会被转换。注意两种格式表达能力不同转换可能损失信息。从 Inkscape 导入字形在 Inkscape 中File → Document Properties单位设为像素px画布设为 1000×1000若字体 em 单位不同则用对应值1000 是 FontForge 默认→ 在 200px 处设水平参考线 → 绘制字形 → 存为 SVG。然后在 FontForgeFile → Import选择 SVG →Element → TransformY 值设为 -200。Hinting 与 TrueType 指令提示替换Hint Substitution与 Flex Hints提示替换会自动发生也可选中某点通过Element → Get Info → Hint Mask控制提示组变更的位置。Flex hints 同样自动生成FontForge 会在合适的场合生成 flex hints需要时向字体添加必要子程序不需要时则不添加。想确认是否会使用 flex hints可打开UpdateFlex偏好项并查看字形——FontForge 会在 flex hint 中心点周围显示绿色光晕。为什么完美提示的字形仍出现不同宽度的笔画、模糊或消失PostScript 和 TrueType 都要求字形按顺时针方向绘制。部分光栅化器对此不敏感但另一些会因逆时针路径产生笔画宽度不一、模糊甚至完全消失。解决方案生成字体前对所有字形执行Element → Correct Direction。为什么修改过的 TrueType 字形远不如原始字形好看FontForge 读取 TrueType 字体时保留全部原始指令但一旦以任何显著方式修改字形原指令即失效它们与轮廓细节紧密耦合FontForge 会将其移除。结果就是被修改的字形外观降级。解决方法用Hints → AutoInstr让 FontForge 自行生成 TrueType 指令。字体格式与排版进阶OpenType、PostScript 与 TrueType 的区别PostScript 和 TrueType 各自定义了文件格式与字形格式。OpenType 使用 TrueType 文件格式承载 PostScript 字形格式OpenType 也包含 TrueType 字形格式但按定义此类字体仍应称为 TrueType 字体。OpenType 中的 PostScript 与 .pfa/.pfb 略有不同pfa/b 是 Type1 字体OpenType 用 Type2 字体——Type2 几乎是 Type1 的超集少量变更、大量扩展Adobe 基于子程序的 Type1 扩展flex hints、提示替换、counter hints在 Type2 中已成为直接指令。OpenType 还能包含额外信息支持复杂脚本阿拉伯文、印度系文字等的排版、字形变体及精细排版。AAT 与 OpenType 的区别两者都是基础 TrueType 字体的扩展可承载复杂脚本排版与字形变体信息但复杂部分使用完全不同的内部格式表达能力不同因此互转必然存在信息损失可能。详见 doc/sphinx/tutorial.rst 与 doc/sphinx/techref.rst 中的相关章节。为什么在 10.3 正常的字体在 Mac 10.4Tiger上出问题Tiger 增加了部分 OpenType 支持部分 OpenType 特性运行时被转换为 AAT 特性但并非所有特性都有对应的 Apple feature/setting条件查找conditional lookups也无法转换。若字体同时包含 OpenType 与 AAT 特性Apple 会忽略 AAT 特性——结果本应可用的 AAT 特性不被使用而支持不全的 OpenType 特性反而被使用。加载字体后引用变成内联副本如何找回引用从 PostScript 字体推断旧引用非常困难FontForge 提供了专用命令Edit → Replace With Reference它会在字体中搜索潜在的引用候选并替换为引用。FontForge 能读取字距kerning信息吗分情况TrueType/OpenType能。字距存于 kern 或 GPOS 表FontForge 均可读取包括 Apple 对 TrueType 规范的一系列扩展。非 Mac 的 PostScript Type1Type1 文件本身不存字距而是存在同名的 .afm 文件。FontForge 读取 PostScript 字体时会查找关联 afm 文件并读入字距。Mac 上的 PostScript Type1不能。字距存于位图字体文件但 Mac 上无法猜测关联位图文件名。AFM/TFM 文件、含 FOND 资源的 Mac 资源文件、Adobe Feature 文件FontForge 都能直接读取字距/特性信息并应用到字体通过File → Merge Feature Info菜单命令。如何设置 OS/2 表或其他表的某一位FontForge 本身不做此事作者编写了配套程序mensis拉丁语意为关于表提供 UI 与脚本两种方式按位访问表。什么是 cidmap 文件背景PostScript 初期每个字形有名称、编码由 256 元素数组指定。面对 CJK 巨量字形集为上万字形起名字既不省空间也无意义于是 Adobe 创建了 CID-keyed 字体无字形名、无编码每个字形只有一个索引CID字体外部另有 cmap 资源提供编码可支持 SJIS 等复杂编码方案。Adobe 为标准 CID 赋予了固定含义JIS208、JIS212、韩文、中文香港/台湾、中文大陆/新加坡、Identity(Unicode) 共 5~6 套标准例如 CID 1 是空格、CID 935 是Katakana ka。仓库中 contrib/cidmap 目录就存放着这些映射文件Adobe-Japan1-6.cidmap、Adobe-GB1-5.cidmap、Adobe-CNS1-6.cidmap 等。cidmap 文件提供 Adobe CID 与 Unicode 的映射让 FontForge 知道正在处理哪个字形缺失时字体视图会显示 ?也无法重编码为 Unicode。它们只对处理 CID-keyed CJK 字体的人有用。什么是 SFD 文件SFD 是 FontForge 自有格式文本文件体积大但人可读仅使用 ASCII 字符老邮件程序传输不会变形是注册 MIME 类型application/vnd.font-fontforge-sfd。格式概览见 doc/sphinx/techref.rst 中 sfdformat 章节。它体积大正是因为它是内存展开格式的 ASCII 表示设计目标是可读而非紧凑。字体名称都有什么含义Element → Font Info的 Names 面板包含 PostScript 字体使用的名称另有 TTF Names 面板对应 sfntTrueType、OpenType 等文件格式中的名称。一个字体可能PostScript 包装在 sfnt 中同时有两套名称通常应保持一致。名称Name for humans如 ITC New Century Schoolbook Italic #4应用用于向人展示FontnamePostScript 内部标识字体用的编程语言名称字符受限不能有空格、不能像数字、无括号且有长度限制如 ITCNewCenturySchoolbook-ItalicFamily name字体族名如 ITC New Century SchoolbookBase Filename仅用于方便控制生成字体时的默认文件名默认是 fontname 加扩展名如 ITCNewCenturySchoolbook-Italic.ttf与字体内容无关Weight string如 Bold、Black、Thin不含 Italic 或 Condensed 等风格变体Copyright版权声明。TTF Names 面板则包含 Family对应 PostScript Family、SubFamily类似 weight 但涵盖全部风格变体如 Bold Italic、Condensed、Fullname对应名称、Copyright。通常 FontForge 会自动设置不满意时可右键选择与 PS 名解除关联。此外还有 WWS Family/WWS SubFamily微软认为必要多数情况应与 Family/SubFamily 相同从而省略、CID fontname仅构建 CID-keyed 字体时使用、Compatible Fullname作者认为应与 Fullname 相同而省略。TTF Names 支持多语言最常被翻译的是 SubFamily如 Italic 在法语为 Italique、德语为 Kursiv、荷兰语为 Cursief。数学问题精度与样条转换Simplify 命令会损失精度吗会但不多。它用一组样条替换原样条保证任意点与原样条偏差不超过局部坐标系中的 1 单位。若需更高精度可在轮廓视图中先Edit → Select → Select All→Element → Transform → Transform放大 1000%Simplify再缩小 10%——最终偏差不超过 0.1 单位。三次样条如何转换为二次样条生成 TrueType 时可能损失精度。FontForge 先检查样条是否已是二次的刚读取 TrueType 字体或奇迹般生成的曲线即如此否则将原样条分段寻找与原三次曲线任意点偏差不超过 1 单位的二次样条组两端点及端点斜率确定后其间只存在一条二次样条。二次样条如何转换为三次样条读取 TrueType 时很简单任何二次样条都可表示为三次样条三次项恒为 0。不过控制点可能不再位于整数坐标保存为三次格式时会有一定精度损失。编码与字形命名如何告诉 FontForge 一个新的编码通常 OpenType/TrueType 字体用标准 Unicode 编码即可但确有需要时流程如下弄清目标编码的样子如天城文可参考 ISCII 编码资料这些编码通常只展示顶部 96 个字符其余假定与 US ASCII 相同创建编码文件如 Devanagari.ps首行写/Devanagari {随后列出所有字符名前置斜杠——先 32 个 .notdef然后是 space、exclam……直至 unicode 字形名如/Devanagari { /.notdef /.notdef ... /.notdef /space /exclam /quotedbl ... /braceright /asciitilde /.notdef ... /.notdef /uni0901 /uni0902 ... /uni096F }用Encoding → Load Encoding将该文件载入 FontForge 的编码列表再应用到目标字体。从源码看这一过程由 fontforge/encoding.c 中的ParseEncodingFile()fontforge/encoding.c#L686-L765实现它会自动识别文件格式——以#或0开头的是联盟编码文件Consortium encoding file否则按 PostScript 样式的名称列表解析无 UI 环境下无名编码会被拒绝带 UI 时会逐一询问编码名称最后把新编码并入全局编码列表。同一函数同时服务于 Python 接口loadEncodingFilefontforge/python.cpp#L597-L606与脚本命令LoadEncodingFilefontforge/scripting.cpp#L3377-L3391并支持文件名与可选编码名两个参数。如何添加一个新名称的字形以向 ISO-8859-1 字体添加 dotlessi 为例两种途径Encoding → Add Encoding Slots...输入额外字形数通常 1→ OK → 滚动到字体末尾找到新槽 → 选中 →Element → Glyph Info→ 在 Unicode Name 输入 dotlessi → 点 Set From Name → OK → 绘制字形。Encoding → Reencode → ISO-10646-1→View → Goto输入 dotlessi → 绘制字形 → 再次Encoding → Reencode改回原编码。为什么 FontForge 给某些字形错误的名称FontForge 遵循 Adobe 的命名约定为兼容旧编码存在已知问题Delta→ U2206 INCREMENT而非 U0394 GREEK CAPITAL LETTER DELTA可能因 Increment 在旧 MacRoman 编码中Omega→ U2126 OHM SIGN而非 U03A9mu→ U00B5 MICRO SIGN而非 U03BCMicro Sign 在 ISO-Latin1 和 MacRoman 中omega1→ Unicode 称之为 GREEK PI SYMBOL看起来像 omegaTcommaaccent/tcommaaccent→ U0162/U0163T WITH CEDILLA而非 U021A/U021BT WITH COMMA BELOW源于早期 Unicode 规范的混淆dotlessj→ UF6BE私有区而非 U0237因为 Adobe 在 Unicode 之前就定义了该字形并占用私有区槽位。这解释了为什么我的希腊字体里没有叫 mu 的字符Adobe 为 Unicode 编码命名希腊字母时更注重向后兼容——mu 指向 Micro Sign 而非希腊字母 μDelta 指向 IncrementOmega 指向 Ohm SignU03D6 被命名为 omega1 而非更贴切的 pi1。如何设置字体的默认字形若名为 .notdef 的字形含样条无引用它将被用作默认字形即请求未编码字形时使用的字形。例外在PostScriptOpenType 字体中默认字形使用 space 字形而非 .notdef这是规范如此。GUI 与系统怪癖如何改变 FontForge 的灰色背景通用机制见 X Resources 文档doc/sphinx/ui.rst 的 misc 章节提供了若干配色组合示例。GUI 字体太小/太大怎么办X server 常对屏幕分辨率估计不准。可在~/.Xdefaults中声明真实屏幕尺寸Gdraw.ScreenWidthInches: 14.7 Gdraw.ScreenWidthCentimeters: 37.3仍嫌字体小可以谎报更小的屏幕尺寸——字体将随之变大。为什么点击最小化视图时窗口却图标化了某些窗口管理器如 gnome-sawtooth会截获 metaalt点击。此时无法用 meta-中键-点击缩小字形请改用View 菜单 → Zoom Out。为什么生成字体并退出后 FontForge 还问是否保存两个原因FontForge 可能需要对一个或多个字形重新生成提示信息——例如这些字形在更早的会话中修改过但此后未生成提示新提示会把字体标记为已更改若字体 Font Info 中有 XUID 字段每次生成 PostScript 字体时 FontForge 都会递增 XUID 末位数字——这也算一次更改Adobe 建议如此可避免字体缓存问题。为什么 Build Accented Glyph 是灰色的要构建 cacuteć这类合成字形字体中必须同时存在字母 c 与COMBINING ACUTE ACCENT而不是 MODIFIER LETTER ACUTE ACCENT后者通常位于圆圈符号区。两者齐备后选项才会激活。想知道某字形需要哪些组件在Element → Glyph Info左侧查看 componentsFontForge 会列出合成字形的组成。为什么希腊扩展区U1F00-U1FFF字形选择了错误的音调符Unicode 将希腊与拉丁音调符统一了尽管二者形态迥异。FontForge 遵循简单的 Unicode 定义时可能为希腊字形选中拉丁音调符。解决办法Unicode 自 U1FBD 起有希腊音调符码位把这些码位填上合适的希腊音调符FontForge 就会优先使用它们。为什么 u、y 上方的音调符没有居中某个笔画略高于另一个。FontForge 将音调符居中于字形最高点若有多个等高点则取平均值。把所有笔画高度统一后即可正确居中。为什么 Remove Overlap 后重叠部分反白反转参与合并的路径方向相反——可能翻转过字形再合并。解决选中出问题的形状执行Element → Reverse Direction。为什么说 EPS file is too complex to be understood多数程序把 EPS 当黑盒读入内存后原样输出给 PostScript 打印机。FontForge 不能这样做——它必须理解并转换 EPS 为更简单格式因此要逐句解释 PostScript而解释全部 PostScript 是巨大工程FontForge 的能力有限遇到无法处理的文件就会报此错。为什么 ttf2afm 在 FontForge 生成的 ttf 文件上崩溃FAQ 记录的调查结论是作者 RedHat 7.3 分发的 ttf2afm 确实崩溃但从 CTAN 下载源码自行构建带调试后不崩溃判定这是 ttf2afm 的 bug 且已被修复另指出 ttf2afm 生成的 afm 文件不合 Adobe 规范。为什么 kaiu.ttf 或 mingliu.ttf 的轮廓看起来完全不像这类 TrueType 字体未存储正确轮廓而是依靠指令移动点来生成轮廓轮廓未经网格拟合、仅被定位。FontForge 读取字体时不会处理指令——对大多数字体这是正确的行为且难以判断何时需要处理。为什么 TeX 无法使用我的字体TeX 链如 dvips期望字体按 TeX Base 编码TeX 文档有时误称其为 Adobe Standard。若遇到打印问题、缺字形等将字体编码改为 TeX BaseElement → Font Info→ Encoding 标签 → 从下拉列表选择 TeX Base。为什么 FontForge 不让我编辑 .mf 文件正如 Knuth 所言所见即所得的问题在于……所见就是所得的全部。考虑 MetaFont 定义top1y2 CapHeight当用户拖动点 2 时FontForge 该如何解释改 CapHeight改笔宽改方程为CapHeight - 30还是(CapHeight XHeight)/2——无法合理消歧故不支持直接编辑 .mf。为什么 Edit → Copy 不复制字形名FAQ 的三点理由定义自定义编码是复制字形名的更好方式多数情况下你并不想要名称美学上复制应只处理数据而非元数据。但鉴于问的人够多已在Edit → Copy From → Char Name提供了可改变默认行为的模式。若Edit → Paste抱怨名称重复多半是勾选了Edit → Copy From → Copy Metadata取消勾选即可。为什么在 Xgl/Compiz 下 FontForge 很难看原因未知但可通过为 FontForge 设置环境变量XLIB_SKIP_ARGB_VISUALS1修复。结语FAQ 文档以诙谐而务实的笔触覆盖了从哲学疑问到实操细节的完整光谱字体点大小的真正含义、OS/2 表的行距字段之争、macbinary 与 FOND 的复杂历史、TrueType 指令对编辑的约束乃至为什么没有路线图。理解这些问题的底层原理——例如ParseEncodingFile如何解析自定义编码、hhea/OS/2 指标如何参与行距计算、指令与轮廓的耦合关系——能帮助你在使用 FontForge 时少走弯路。若你正被某个诡异现象困扰先查 FAQ 往往比盲目调整更高效答案很可能就在其中。赞分享桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载相关推荐FontForge 原生脚本编程实战从 Type1 到 TrueType 的批量字体转换指南FontForge 原生脚本编程实战从 Type1 到 TrueType 的批量字体转换指南 导读 本指南以 FontForge 官方脚本教程为主线带你从零桌面应用图形学如何快速集成fuse-swift到你的Swift项目从安装到搜索只需3步如何快速集成fuse swift到你的Swift项目从安装到搜索只需3步 fuse swift是一个轻量级模糊搜索库零依赖特性让它成为Swift项目的理想选如何轻松实现PyTorch到ONNX模型转换企业级语音活动检测器部署指南如何轻松实现PyTorch到ONNX模型转换企业级语音活动检测器部署指南 Silero VAD是一款企业级的预训练语音活动检测器能够精准识别音频中的人声活动人工智能语音上一篇PP-OCRv6_tiny_det实战教程10个场景下的文字检测应用案例下一篇gh_mirrors/1o/1on1-questions前端框架选型React vs Vue的性能对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

3步搞定国外黄冈网站推广软件选型与注意事项
3步搞定国外黄冈网站推广软件选型与注意事项

3步搞定国外黄冈网站推广软件选型与注意事项 自己不会代码想做网站,却卡在技术门槛上?这不仅是你的痛点,也是无数中小企业主的噩梦。很多甲方朋友拿着预算找外包,结果被坑得找不着北,或者自己瞎折腾三天两头报错。今天咱们不聊虚的,直接拆解【国外黄冈… · 2026/9/27 21:25:22

rsuite DateRangePicker renderValue 详解:自定义日期范围显示与格式化实战
rsuite DateRangePicker renderValue 详解:自定义日期范围显示与格式化实战

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 本文以 rsuite DateRangePicker 组件的 renderValue 属性为核心,讲解如何完全自定义日期范围… · 2026/9/27 21:25:22

小白必看!OpenClaw入坑指南:TaoToken统一Key接入与settings.json配置骨架
小白必看!OpenClaw入坑指南:TaoToken统一Key接入与settings.json配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 21:25:22

如何制作一个网页网站:被黑挂马后,我花了3万重做
如何制作一个网页网站:被黑挂马后,我花了3万重做

如何制作一个网页网站:被黑挂马后,我花了3万重做 网站被黑挂马不知道怎么办?这是上周深夜我接到客户电话时,听到的第一句话。他的电商首页突然弹出一堆博彩广告,浏览器提示不安全,后台登录也进不去了。他问我:“这种烂摊子,彻底修好大概要多少钱?”… · 2026/9/27 22:02:30

Naise AI 核心应用场景与落地实践指南
Naise AI 核心应用场景与落地实践指南

在日常开发和产品落地过程中,我们常常面临一个核心痛点:如何让人工智能真正融入业务流,而不是仅仅作为一个聊天玩具存在?很多团队引入了大模型,却只停留在“问一个问题得到一个回答”的浅层交互上,实际的生… · 2026/9/27 22:02:30

8种常见代码编译软件配 TaoToken:从 VS Code 到 Vim 的统一 Key 配置骨架
8种常见代码编译软件配 TaoToken:从 VS Code 到 Vim 的统一 Key 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:02:30

DLMS/COSEM 蓝皮书解读(六):Register activation 类(class_id = 6)—— 费率切换的“总开关“
DLMS/COSEM 蓝皮书解读(六):Register activation 类(class_id = 6)—— 费率切换的“总开关“

DLMS/COSEM 蓝皮书解读(六):Register activation 类(class_id 6)—— 费率切换的"总开关"系列说明:本系列基于 DLMS UA《Blue Book(蓝皮书)第 16 版 第 2 部分》&#x… · 2026/9/27 22:02:30

客户问“你们接大模型了吗”,我该怎么答:TaoToken 统一 Key 接入 AI 工具配置指南
客户问“你们接大模型了吗”,我该怎么答:TaoToken 统一 Key 接入 AI 工具配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:02:23

网站备案核验单怎么选避坑指南图解步骤详解
网站备案核验单怎么选避坑指南图解步骤详解

网站备案核验单怎么选避坑指南图解步骤详解 找建站公司最怕什么?怕被坑高价,怕最后交付的东西连个正经备案都下不来。很多老板以为花钱买个网站就完事了,结果卡在“网站备案核验单”这一步,因为不懂行,被销售忽悠着填错信息、选错服务,导致备案被驳回甚… · 2026/9/27 22:02:23

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码