OpenType フォントファイル形式
OpenType フォント。通常は CFF/PostScript のアウトラインを持ちます。
- MIME タイプ
- font/otf
- 拡張子
- .otf
- カテゴリ
- フォント
マジックナンバー(ファイル署名)
| 0x00000000 | 4F54544F | OTTO | 'OTTO' sfnt tag |
OpenType フォント形式について
OpenType は Microsoft と Adobe が共同で作った、TrueType と Type 1 の両方の後継です。.otf ファイルは .ttf と同じ sfnt コンテナで、テーブルディレクトリも、ビッグエンディアンの数値も、head・cmap・name・OS/2 といったテーブルも同じ。違うのはアウトラインが Type 2 charstring として書かれた 3 次ベジエ曲線であり、それが CFF テーブル 1 つに格納されていること、そしてオフセット 0 のタグがバージョン番号ではなく ASCII 文字列 OTTO であることです。組版に携わる人が OpenType と聞いて思い浮かべるもの(リガチャ、スモールキャップス、文脈依存の異体字)はすべて GSUB と GPOS のテーブルにあり、TrueType 流儀のフォントでも同じように使えます。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 4 | sfntVersion | 4F 54 54 4F、つまり ASCII の OTTO。ファイル全体を通して、アウトラインが TrueType ではなく PostScript だと宣言している唯一の場所です。CFF フォントを包んだ WOFF や WOFF2 では、ラッパーがこのフィールドを 4 バイト後ろへずらすので、同じ 4 バイトがオフセット 4 に現れます。 |
| 4 | 2 | numTables | 後ろに続く 16 バイトのテーブルレコードの数。ビッグエンディアンで、それ自体が有用な健全性チェックになります。実在のフォントが持つテーブルは 9 個から 30 個ほどなので、何千という値が出たらそれは sfnt ではないか、読み手がバイト順を入れ替えているかのどちらかです。 |
| 6 | 2 | searchRange | numTables を超えない最大の 2 のべき乗 × 16。パーサーが無視する旧来の二分探索ヒントで、実在のフォントでも平然と間違っています。Apple は式と合わない値を持つ OTTO のシステムフォントを出荷していますが、どのラスタライザも文句なく開きます。 |
| 8 | 2 | entrySelector | その 2 のべき乗の 2 を底とする対数。同じく打ち捨てられたヒントの一部で、地球上のあらゆるツールが読むディレクトリからフィールドを取り除くリスクに見合わなかった、という理由だけで残っています。 |
| 10 | 2 | rangeShift | numTables × 16 から searchRange を引いた値。名残のフィールド 3 つ目にして最後の 1 つで、ここが食い違っていても、フォントが健全かどうかについては何も語りません。 |
| 12 | variable | Table records | 1 レコード 16 バイトで、タグ、チェックサム、絶対ファイルオフセット、長さがすべてビッグエンディアン。レコードはタグ順に並び、空白文字はどの文字よりも先に来るので、OTTO フォントの最初のレコードはほぼ必ず CFF に空白を足したもの(43 46 46 20)になります。ヘッダの主張どおりのファイルかどうかを 2 秒で目視確認できます。 |
| variable | 54 | head table | ディレクトリのレコード経由で見つけます。12 バイト目にマジックナンバー 5F 0F 3C F5、unitsPerEm は +18。なお PostScript アウトラインでは 1000、TrueType では 2048 が慣例ですが、どちらの流儀でも両方が合法で、実際に両方が出荷されています。判定材料ではなく手掛かり程度に考えてください。 |
| variable | variable | CFF table | 完全な Compact Font Format のプログラムがまるごと埋め込まれていて、独自のヘッダ、独自の INDEX 構造、top dictionary、そしてグリフを描く charstring を持ちます。フォントの中のフォントです。だから CFF テーブルが壊れたファイルは、sfnt レベルの検査をすべて通過し、正しいファミリー名とメトリクスを報告しながら、何も描画しないという状態になります。 |
似た形式との見分け方
| 紛らわしい形式 | 見分け方 |
|---|---|
| TrueType フォント | オフセット 0 の 4 バイト、それだけです。4F 54 54 4F なら CFF アウトライン、00 01 00 00 なら glyf アウトライン。拡張子はどちらの向きにも当てになりません。.otf が TrueType アウトラインを含んでいても合法ですし、OpenType という語が指しているのは中の曲線ではなく外側の包みです。確実にしたいなら、ディレクトリに CFF テーブルがあるか glyf テーブルがあるかを見てください。 |
| Type 1 (PFB/PFA) | OpenType/CFF が置き換えるために作られた形式です。バイナリの Type 1 フォントは PFB のセグメントマーカー 80 01 で始まり、プレーンテキスト版はそのまま %!PS-AdobeFont という文字列で始まります。どちらも sfnt ではなく、テーブルディレクトリも cmap もなく、Unicode のコードポイントでグリフを引く方法もありません。Adobe は 2023 年に Type 1 のサポートを終了し、それらのアウトラインが移された先が OTTO ファイルです。 |
| WOFF2 フォント | ウェブ向けに包まれた CFF フォントは、オフセット 0 が 77 4F 46 32、オフセット 4 が 4F 54 54 4F になります。OTTO のタグは消えたのではなく、ずれただけです。これが素朴な判定器を両方向に引っ掛けます。先頭 16 バイトのどこかに OTTO を探す実装は WOFF2 を OpenType フォントと呼びますし、オフセット 0 しか見ない実装は同じファイルを不明と報告します。 |
| TrueType Collection (.ttc) | コレクションは TrueType と同じくらい気軽に CFF フォントも収められて、そのどちらもオフセット 0 のタグ 74 74 63 66(ttcf)の後ろに隠します。本物のテーブルディレクトリは 12 バイト目以降に列挙されたオフセットの先にあるので、OTTO のタグは先頭ではなくファイルの奥深くに現れます。hex で OTTO を検索すれば見つかり、オフセット 0 を確認するだけでは見つかりません。 |
よくある壊れ方
- ダウンロードの途中切れ。ディレクトリは先頭にあって生き残るのでタグも長さも正しく見えますが、CFF テーブル(たいていファイル中で最大なので、たいてい最後に置かれます)が切られた部分です。フォント選択画面には正しく並び、そして何も描画しません。
- テキストモード転送。CFF の charstring 内での改行変換は最初の 0D 0A より後ろを全部ずらします。CFF は INDEX を入れ子にした自己記述的な構造なので、失敗の出方も綺麗ではありません。パーサーは長さフィールドをたどって別の何かの途中へ飛び込み、実際の破損箇所からかけ離れた場所で問題を報告します。
- 古いままの checkSumAdjustment。フォントをサブセット化したりパッチを当てたりするツールが head テーブルの 8 バイト目の値を計算し直し忘れると、描画は完璧なのに検証には落ちるフォントが残り、編集前に署名された DSIG テーブルも無効になります。
- リネームされたウェブフォント。フォントサービスからダウンロードした .woff2 に .otf という拡張子を付けても、どこにもインストールできません。中身は Brotli 圧縮で、先頭 4 バイトは wOF2 です。OS が返すエラーはたいてい「ファイルが壊れています」なので、存在しない破損を探しに行かされることになります。
- 先頭に付いたゴミ。キャプティブポータルや、HTML のエラーページを返すプロキシ越しに配信されたフォントは、オフセット 0 に doctype を抱えて届きます。下流のすべてが「認識できないフォント形式」と報告しますが、hex ビューアで先頭 16 バイトを一目見れば調査は終わります。
この形式の現在地
OTF はフォントベンダーが出荷する形式です。ベンダーが販売する製品フォント、Adobe のアプリに同梱されるライブラリ、印刷やエディトリアルデザインを狙ったものはほぼすべて、CFF アウトラインを持つ OTTO ファイルとして届きます。デザインの世界がその系譜から来たからでもあり、3 次曲線が書体デザイナーの描き方に合っているからでもあります。ウェブでの立場は TrueType と同じで、@font-face で使えはするものの正解ではなく、同一のテーブルを包む WOFF2 に取って代わられました。PDF では他に代えのきかない役割があります。CFF のフォントプログラムはサブセット化して PDF に直接埋め込めるので、印刷のワークフローがウェブ用ビルドだけでなく OTF を手元に残したがるのはそのためです。バリアブルフォントの話はここで枝分かれしました。CFF のバリアブルには CFF2 という新しいテーブルが必要で、その対応は TrueType のバリアブルより遅く、しかも足並みが揃いませんでした。だから元の描画が 3 次でも、バリアブルファミリーを出すデザイナーは結局 TrueType 流儀で納品することがよくあります。
OpenType フォントファイルをこのサイトで開く
どれもブラウザ内で動きます。ファイルが端末から出ることはありません。
関連する形式
OpenType フォントと混同しやすい形式です。先頭バイトを見比べてください。
| 形式 | 先頭バイト | 拡張子 |
|---|---|---|
| TrueType フォント | 00 01 00 00 | .ttf |
| WOFF フォント | 77 4F 46 46 | .woff |
| WOFF2 フォント | 77 4F 46 32 | .woff2 |