TTF / OTF / WOFF / WOFF2
最后更新 2026-11-02
本页目录
后缀名是习惯,不是规范。.ttf 与 .otf 都可能是同一种容器,只是里面装的轮廓不同;.woff 与 .woff2 则根本不是新格式,而是「给网页用的压缩包装」。
先看文件头,不看后缀
字体文件开头的四个字节(sfntVersion)说明了它到底是什么:
| 开头 | 是什么 |
|---|---|
00 01 00 00 |
TrueType 容器 |
OTTO |
OpenType 容器(通常装 CFF 轮廓) |
true / typ1 |
很老的 Apple 写法 |
ttcf |
字体集合(一个文件里多个字款) |
wOFF |
WOFF 包装 |
wOF2 |
WOFF2 包装 |
所以「OTTO 开头的一定是 .otf」和「.otf 里一定没有 TrueType 轮廓」都不对——惯例如此,规范不强制。
TrueType 与 CFF:两套轮廓
真正的区别在轮廓怎么存:
- TrueType:用二次贝塞尔曲线,表是
glyf+loca; - CFF / CFF2:用三次贝塞尔曲线,表是
CFF(注意名字末尾有个空格)或CFF2。
两套轮廓在同一套「表」的框架里,所以 name、OS/2、cmap 这些长得一模一样。这也是为什么同一个设计导成两种格式后,除了轮廓之外的东西几乎不变。
字体集合
.ttc / .otc 把一个家族的多个字款打进一个文件,共用 cmap 与 name 的部分数据,省体积。系统字体常见(比如 macOS 的许多内置字体)。
对程序来说这不是「一个字体」,而是一个容器:要按索引挑出其中一个字款。本站遇到集合时会优先挑与请求家族匹配的那一个。
WOFF 与 WOFF2
两者都是容器:把原始字体压缩后包一层,并加上元数据与私有数据的位置。解开之后,里面还是普通的 TrueType/OpenType。
- WOFF:zlib 压缩;
- WOFF2:Brotli 压缩,并且重排了部分表结构(能显著更小)。
浏览器支持 WOFF2,老浏览器退回 WOFF。网页字体优先用 WOFF2,不是为了省事,是因为它确实小得多。
变量字体是「额外表」,不是新格式
变量字体的文件后缀与静态字体一样,区别在于里面多出了 fvar(轴)、gvar 或 CFF2(每个轴上的变化)、STAT(样式属性)。所以:
- 一个
.ttf可能含无数个字重(fvar+gvar); - 也可能只含一个(静态)。
单看后缀判断不了,要看表目录。
本站的立场
本站不托管、不提供下载任何字体文件(见 docs/adr/0001):服务端只存指纹与元数据。所以你在这里看到的是「这个字体存在、长什么样、有什么度量」,而不是「点这里下载」。
检查器里能「临时载入」库字体,是从上游 CDN 把字节取到浏览器内存里临时注册,用完即弃,不落到本站的存储上。
延伸阅读
- OpenType 规范:sfnt 容器与
glyf/CFF的说明 - W3C:WOFF 与 WOFF2 规范
- OpenType 规范:
fvar/gvar/STAT