本文へスキップ

フォントのサブセット化

Font Subsetter

TrueTypeフォントを実際に使う字だけに削ぎ落としてWOFFにも包む、日本語ウェブフォントで数MBと数十KBを分ける作業です。

TrueTypeのフォントを、ページが実際に使う文字だけに切り詰め、残ったものから正しいファイルを組み直します。韓国語ではこれが数メガバイトのダウンロードと数百キロバイトの差になります。ハングルを完全に収録したフォントは11,172の音節を持ち、1ページが使うのは数百だからです。TTFと並べてWOFFも出せますし、渡す前に自分の出力を読み直して確かめます。

🔒 ブラウザの中だけで動きますfontsubsetperformancewebfont

TTF ファイルを置いてください

TrueType 輪郭のフォントだけです(.ttf、または glyf テーブルのある .otf)。すべてこのタブの中で行います。

どう切るか

  • · 指定した文字のグリフと、それが参照する部品グリフ(合成グリフの閉包)を残したうえで glyf·loca·hmtx·hhea·maxp·cmap(形式 4 と 12)と post を書き直します。テーブルのチェックサムと head.checkSumAdjustment も計算し直します。
  • · 出来上がったファイルは同じパーサーで読み直し、通ったものだけを渡します。ヒンティングのプログラム(fpgm·prep·cvt)はそのままです。
  • · 入れ忘れた文字は、その場所が空の箱になります。ページの実際の文章を貼るか、韓国語なら KS X 1001 の 2,350 音節を有効にしてください。

先にフォントを見るならフォント情報ビューアー、形式だけ変えるならフォント形式変換があります。

使い方

  1. TrueTypeのファイルを置きます

    `.ttf`か、中身がTrueTypeのアウトラインである`.otf`です。CFFのフォントはここではサブセット化できないので、開いた時点でどちらの種類かをパネルが示します。

  2. ページで使う文章を貼り付けます

    実際の文言をコピーしてください。見出し、ラベル、ボタンの文字、エラーメッセージです。重複は自動的にまとめられます。入れ忘れた文字は最終的なページで空の箱として描かれるので、多めに入れるほうに寄せてください。

  3. 自分の文章と標準の集合のどちらにするか決めます

    ここが本当の決定です。自分の文章だけを貼れば最小のファイルになりますが、誰かが入力欄に名前を打ち込んだ瞬間に崩れます。KS X 1001の2,350音節を有効にすればファイルは大きくなりますが、任意の韓国語の入力に耐えます。固定のマーケティング文言なら前者、利用者の書いたものが入るなら後者です。

  4. 生成して数字を読みます

    前後のグリフ数、前後のバイト数、削減率です。指定した文字がフォントにない場合は、黙って落とすのではなく一覧に出します。

  5. ファイルと、その横の@font-faceを取ります

    宣言のウェイトとイタリックの指定は、フォント自身のOS/2とpostのテーブルから読んだものなので、推測ではなくファイルに一致します。

よくある質問

OTFが受け付けられません。なぜですか。

そのファイルがCFF(PostScript)のアウトラインを持っているからです。それをサブセット化するには別のアウトライン形式のチャーストリングを書き直すことになり、ここでやっているTrueTypeの`glyf`レコードを切る処理とは別のプログラムです。壊れたファイルを作る代わりに、ページはそう伝えます。デスクトップでfonttoolsのpyftsubsetを使ってください。フォント情報ビューアーはそのまま使えます。

カーニングと合字は残りますか。

残りません。`GPOS`と`GSUB`は落とし、落としたときはページがそれを一覧に出します。欧文なら、サブセットにカーニングのペアも合字も残らないということです。韓国語ではめったに問題になりません。ハングルの合成はグリフそのものの中にあるからです。カーニングが効いていないと困るなら、それらのテーブルを書き直せるfonttoolsでサブセット化してください。

可変フォントはどうなりますか。

既定のインスタンスとして出てきます。可変のテーブルは引き継がれません。サブセットは作業用のファイルではなく配布物なので、たいていはそれで問題ありません。ただし、ある軸に頼っていたのなら、実際に使う静的なインスタンスをサブセット化してください。

WOFF2は作れますか。

作れません。WOFF2にはBrotliが要り、ブラウザはページにそれを渡しません。WOFFは作れて、`CompressionStream("deflate")`で生成します。TTFからさらに40〜50%ほど減るのがふつうです。WOFF2ならそこからさらに20〜30%ほど減りますが、それにはデスクトップの道具が要ります。

一部の文字が空の箱になりました。

サブセットを作ったときの文字一覧に、その文字が入っていなかったからです。それがサブセット化の取引そのもので、ファイルには指定したものしか入りません。足りない文字を加えて作り直すか、KS X 1001の集合を有効にして、任意の韓国語の入力にも受け皿があるようにしてください。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。