跳到正文

字体格式转换

Font Converter

在浏览器里把 TTF、OTF 和 WOFF 互转,并生成配套的 @font-face 规则;WOFF2 需要 Brotli,这里不做,会指给你桌面工具。

在 sfnt 格式和 WOFF 1.0 之间双向转换,从你拖入的文件判断该往哪个方向走。两个方向都无损:WOFF 是一个容器,打包和解包给回同样的表,`head.checkSumAdjustment` 会重新计算,所以结果能通过验证。WOFF2 会被拒绝,页面会解释原因,而不是悄悄失败。

🔒 完全在你的浏览器里运行fontconvertwoff2webfont

TTF · OTF → WOFF,或者 WOFF → TTF · OTF

放一个文件进来,方向由这边判断。一切都在这个标签页里完成。

哪些能做,哪些不能

  • · TTF · OTF ⇄ WOFF 1.0:按 WOFF 规范(W3C,2012)逐表做 zlib 压缩,写一个 44 字节的头和目录。压缩用的是浏览器自带的 CompressionStream('deflate'),解包时按原来的校验和重新拼出 sfnt,所以 head.checkSumAdjustment 也是对的。两个方向都无损。
  • · WOFF2 既造不出来也解不开。它需要 Brotli,而 Web 平台并不把 Brotli 暴露给页面。真要 WOFF2,就用桌面工具——通常还能比 WOFF 再小 20–30%。
  • · TTF ⇄ OTF(CFF) 这种换轮廓格式的事,是重画而不是转换,所以这里不提供。扩展名是 .otf、里面其实是 TrueType 的字体,照常处理。
  • · 字体的授权(OS/2 的 fsType)不会因为转换而改变。放到服务器上之前先看清楚发布条款。

要减体积,格式转换远不如字体子集化:把一个韩文字体裁到 2,350 个音节,能小 90% 以上。

怎么用

  1. 拖入一个文件

    TTF 或 OTF 被打包成 WOFF;WOFF 被解包回 TTF 或 OTF,取决于它装的是哪种轮廓。没有方向开关,因为前四个字节的签名已经说明了该往哪走。

  2. 检查前后的大小

    转到 WOFF 通常减 40–50%,那是逐表的 zlib,没有什么巧妙的东西。如果几乎没动,字体很可能已经是压缩数据——比如一个有大量打包字符串的 CFF 字体。

  3. 取文件和 @font-face

    声明假定文件和样式表放在一起,字重和斜体值从字体的 OS/2 和 post 表里读出,而不是从文件名猜。

常见问题

为什么它不做 WOFF2?

WOFF2 是 Brotli 压缩的,还会重排和变换字形表。Web 平台只给页面带 deflate 和 gzip 的 `CompressionStream`——没有 Brotli,所以在浏览器里两个方向都不可能。在桌面上,fonttools(`pyftsubset --flavor=woff2`)或 `woff2_compress` 能做,在 WOFF 之上大约再减 20–30%。

它能把 TTF 变成真正的 OTF 吗?

不能,任何诚实的工具都不能。TrueType 用二次曲线,CFF 用三次曲线;在它们之间转换是带容差的曲线重新拟合,会改变轮廓——那是重新绘制字体,不是转换它。这里处理的是常见的那种情况:一个内部是 TrueType 轮廓的 `.otf`,只有扩展名有误导性。

我还需要 WOFF 吗,还是 TTF 就行?

由服务器用 gzip 或 brotli 提供的 TTF 最终接近 WOFF,所以格式没有以前那么要紧了。WOFF 仍然值得有:服务器不压缩时它也压缩,而且每个要紧的浏览器都支持它十年了。大得多的收益是子集化,不是容器。

转换会改变许可允许的范围吗?

不会。OS/2 的 fsType 和每条 name 记录原样通过,这意味着一个你不能嵌入的字体,变成 WOFF 之后仍然是一个你不能嵌入的字体。放到服务器上之前检查分发条款;查看工具会显示这些记录。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。