规范概览
当前状态
| 项目 | 状态 |
|---|---|
| 规范版本 | v1.0.0(formatVersion = 1),字段与约束已冻结 |
| 兼容性判定依据 | formatVersion(主版本号),不是 mfpVersion |
| JSON Schema | draft 2020-12,可被各语言实现直接引用 |
| 文档完整性 | 协议规范 + 实现指南 + Schema + 示例 + 变更记录 + 贡献指南 |
| 客户端实现 | 见 仓库镜像 中的最新进展 |
规范文档的构成
| 文件 | 层次 | 内容 |
|---|---|---|
SPEC.md | 协议层 | 权威定义:字节布局、字段语义、兼容规则、校验流程 |
IMPLEMENTATION.md | 实现层 | 客户端实现指南:模块划分、接口签名、伪代码、验收清单 |
schema/manifest.schema.json | 数据层 | manifest 的 JSON Schema(draft 2020-12) |
schema/template.schema.json | 数据层 | 预览模板的 JSON Schema |
examples/ | 示例 | 最小与完整 manifest、默认预览模板、字节级布局示意 |
CHANGELOG.md | 记录 | 各版本变更 |
CONTRIBUTING.md | 协作 | 贡献指南,含"本仓库管什么、不管什么"的边界 |
关键定义
兼容性以 formatVersion 为准
.mfp 同时存在两个版本概念,容易混淆:
| 字段 | 含义 | 是否影响兼容性 |
|---|---|---|
formatVersion | 格式本身的版本(主版本号) | 是,这是唯一判据 |
mfpVersion | 产包工具 / 客户端的版本 | 否 |
读取端应根据 formatVersion 决定能否处理,遇到无法识别的主版本号时明确拒绝, 而不是尝试按已知版本解析。
必须遵守的约束
| 约束 | 内容 |
|---|---|
| 偏移修正 | 前置 32 字节 Header 后,必须同步修正 ZIP 结构中所有偏移字段 |
| 中央目录位置 | 必须位于数据区之后、EOCD 之前 |
| Footer 位置 | Footer Descriptor 必须紧跟 ZIP EOCD |
| 字节序 | Header 与 Footer 中所有多字节整数必须小端序 |
| 条目命名 | 字体条目以内容 SHA-256 命名 |
详情见 容器结构。
校验流程
读取一个 .mfp 时建议按下面的顺序校验,任一步失败都应给出明确的原因, 而不是笼统地报"文件损坏":
- 识别 —— 检查偏移 0 的 magic 是否为
MFP\x01 - 版本 —— 读取
formatVersion,确认当前实现能处理 - 定位索引 —— 按
manifestOffset取出manifest.json并解析 - 结构校验 —— 校验 ZIP 中央目录完整性
- 内容校验 —— 逐条目比对 SHA-256 与
checksum结构 - 签名(可选) —— 存在签名条目时验证签名
- 降级处理 —— 可选字段缺失时按规范既定规则降级,不拒绝读取
打包侧的自检建议
打包流程末尾应当加一步独立自检:用独立于写入路径的 ZIP 库打开产物、 列出条目并实际解压一个条目,验证偏移修正正确。
这是唯一能可靠发现"偏移漏改"的方法 —— 因为多数工具对未修正的偏移存在宽容行为, 问题可能在很久以后才在某个特定条目上暴露。
详见 通用工具兼容性 中关于宽容度的实测与分析。
许可
规范文本本身以 MIT 发布。规范允许你实现该格式, 但不授予你对包内字体文件的任何权利 —— 字体的再分发受其自身许可证约束。