ByteScope

OpenType フォントファイル形式

OpenType フォント。通常は CFF/PostScript のアウトラインを持ちます。

MIME タイプ
font/otf
拡張子
.otf
カテゴリ
フォント

マジックナンバー(ファイル署名)

0x000000004F54544FOTTO'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 流儀のフォントでも同じように使えます。

ヘッダーの構造(バイト単位)

オフセット長さフィールド意味
04sfntVersion4F 54 54 4F、つまり ASCII の OTTO。ファイル全体を通して、アウトラインが TrueType ではなく PostScript だと宣言している唯一の場所です。CFF フォントを包んだ WOFF や WOFF2 では、ラッパーがこのフィールドを 4 バイト後ろへずらすので、同じ 4 バイトがオフセット 4 に現れます。
42numTables後ろに続く 16 バイトのテーブルレコードの数。ビッグエンディアンで、それ自体が有用な健全性チェックになります。実在のフォントが持つテーブルは 9 個から 30 個ほどなので、何千という値が出たらそれは sfnt ではないか、読み手がバイト順を入れ替えているかのどちらかです。
62searchRangenumTables を超えない最大の 2 のべき乗 × 16。パーサーが無視する旧来の二分探索ヒントで、実在のフォントでも平然と間違っています。Apple は式と合わない値を持つ OTTO のシステムフォントを出荷していますが、どのラスタライザも文句なく開きます。
82entrySelectorその 2 のべき乗の 2 を底とする対数。同じく打ち捨てられたヒントの一部で、地球上のあらゆるツールが読むディレクトリからフィールドを取り除くリスクに見合わなかった、という理由だけで残っています。
102rangeShiftnumTables × 16 から searchRange を引いた値。名残のフィールド 3 つ目にして最後の 1 つで、ここが食い違っていても、フォントが健全かどうかについては何も語りません。
12variableTable records1 レコード 16 バイトで、タグ、チェックサム、絶対ファイルオフセット、長さがすべてビッグエンディアン。レコードはタグ順に並び、空白文字はどの文字よりも先に来るので、OTTO フォントの最初のレコードはほぼ必ず CFF に空白を足したもの(43 46 46 20)になります。ヘッダの主張どおりのファイルかどうかを 2 秒で目視確認できます。
variable54head tableディレクトリのレコード経由で見つけます。12 バイト目にマジックナンバー 5F 0F 3C F5、unitsPerEm は +18。なお PostScript アウトラインでは 1000、TrueType では 2048 が慣例ですが、どちらの流儀でも両方が合法で、実際に両方が出荷されています。判定材料ではなく手掛かり程度に考えてください。
variablevariableCFF 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

よくある質問

ファイルのマジックナンバーとは何ですか?

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。PNG は必ず 89 50 4E 47 で始まり、ZIP は 50 4B 03 04 で始まります。OS もブラウザも file コマンドも、拡張子を信用せずこのバイト列を読みます。だからファイル名を変えても中身の正体は変わりません。

マジックナンバーを自分で確認する方法は?

macOS や Linux なら xxd -l 16 ファイル名 で先頭 16 バイトが表示されます。Windows なら PowerShell で Format-Hex -Path ファイル名 -Count 16 です。あるいはこのサイトのファイル形式判別ツールにドロップすれば、ローカルでバイト列を読んで形式を教えてくれます。アップロードはありません。

2 つの形式が同じマジックナンバーを持つのはなぜ?

一方が他方の上に作られているからです。docx、xlsx、pptx、apk、jar、epub はすべて中身が ZIP アーカイブなので ZIP の署名で始まり、区別するには内部のエントリを見る必要があります。Java の class ファイルと macOS のユニバーサルバイナリはどちらも CA FE BA BE で始まり、直後のフィールドで見分けます。

マジックナンバーがまったくないファイルもある?

あります。XML、HTML、JSON、SVG、CSV といったテキストベースの形式には固定のバイト署名がないため、構造から判別します。先頭の <?xml 宣言、<svg 要素、あるいは { に続く引用符付きのキーなどです。これは確定ではなく推測なので、このリファレンスではそうした形式をプローブ判別として示しています。

マジックナンバーが一致すればそのファイルは安全?

いいえ。わかるのは形式であって、中身が無害かどうかではありません。正規の PDF や docx でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

OpenType フォントかもしれないファイルをお持ちですか?ファイル形式判別ツールで調べる — マジックナンバーをローカルで読み取ります。アップロードは一切ありません。またはすべての形式を見る。