Base64 のフォントをデコードする方法
- Base64 または data URI に、素の Base64、
data:font/woff2;base64,d09GMg…のような data URI、またはそれを含む CSS のいずれかを貼り付けます。1 つのルールにsrcが複数ある場合は、最初の data URI が使われます。 - プレビューには、
The quick brown fox jumps over the lazy dog 0123456789というパングラムと、アルファベット全体の行がそのフォントで表示されます。サンプルテキスト に入力すれば、好きな言葉で試せます。 - 情報欄には、フォントファイル自身が記録している情報が表示されます。フォントファミリー、スタイル、フルネーム、バージョン、グリフ数、em あたりのユニット数 です。
- ファイルをダウンロード を押すと、形式に合った拡張子で保存されます。
ブラウザがフォントを受け付けると、情報欄の下のステータス行に「デコードしたフォントで描画しています。」と表示されます。フォントはこのページ専用の非公開の名前で登録され、別のものをデコードすると再び削除されます。ページの Content Security Policy が Cloudflare のページビュー計測以外のネットワーク通信を許さないので、ファイルがどこかへ送られることはありません。
形式と読み取れる情報
| Base64 の先頭 | 形式 | 名前とグリフ数 |
|---|---|---|
AAEAAAA | TrueType(.ttf) | 読み取る |
T1RUTw | CFF アウトラインの OpenType(.otf) | 読み取る |
dHRjZg | TrueType または OpenType のコレクション(.ttc)。1 ファイルに複数のフォント | 最初のフォントについて読み取り、フォント数も表示 |
d09GRg | WOFF 1.0、zlib 圧縮のテーブル | 読み取る |
d09GMg | WOFF2、Brotli 圧縮のテーブル(CFF アウトラインを包む場合は d09GMk9UVE8) | 読み取らない |
WOFF2 の場合、ファミリーの行には「読み取らず(WOFF2 のテーブルは Brotli 圧縮)」と表示されます。ページ自体は Brotli を展開せず、展開を行うブラウザのフォントエンジンはその結果を外に出さないからです。描画には影響しないので、フォントが正しく見えるかどうかは確認できます。保存した後に名前を読みたい場合は、fontconfig の fc-scan が WOFF2 に対応しています。
fc-scan --format "%{family}: %{style}\n" font.woff2
Material Icons フォントなら Material Icons: Regular と表示されます。
フォントが描画されない場合
「ブラウザがこのフォントを拒否しました。破損しているか、フォントではない可能性があります。」は、ブラウザのフォントサニタイザーがファイルを拒否したという意味です。Chrome と Firefox は、Web フォントを使う前に必ず構造上のエラーを確認します。途中で切れたフォントや、大きなファイルから誤ったオフセットで切り出したフォントは、このチェックに通りません。デコード後のサイズを元のものと比べてください。末尾が欠けた Base64 文字列をデコードすると、最後のテーブルが壊れたフォントになります。
情報欄に名前は表示されるのにサンプルが空のままなら、入力した文字のグリフがフォントにありません。次のような場合に起こります。
- アイコンフォント:記号は
U+E000以降などの私用領域のコードポイントに置かれています。Material Icons をはじめ合字(リガチャ)を使うフォントでは、homeのようにアイコンの名前を入力するとアイコンが表示されます。 - サブセットフォント:Web ページは必要な文字だけを、ときには数十文字だけを埋め込むことがよくあります。ファイルに含まれる数は グリフ数 で分かります。
- ほかの文字体系用のフォント:アラビア文字やデーヴァナーガリー用に作られたフォントには、ラテン文字がないことがあります。
データがそもそもフォントでない場合は、注意書きにその正体が示されます。「これはフォントではなく PDF のようです。」などで、対応するダウンロードボタンも表示されます。
Base64 のフォントはどこから来るのか
ほとんどは CSS からです。ビルドツールは小さなフォントを data: URI としてスタイルシートにインライン化しますし、単一ファイルの HTML エクスポート、オフライン用のレポート、テキストを含む SVG ファイルも同じ方法でフォントを持ち運びます。インライン化にはコストがあり、埋め込んだフォントはスタイルシートと別にキャッシュできません。詳しくは data URI のパフォーマンス を参照してください。フォントファイルをこうしたルールに変換するには、フォントを Base64 に変換 を使ってください。
Python でスタイルシートからすべてのフォントを取り出す
このツールは最初に見つかった data URI をデコードします。複数のフォントを埋め込んだスタイルシートなら、短いスクリプトですべてを正しい拡張子で保存できます。
import base64, re
SIGNATURES = {b"wOF2": "woff2", b"wOFF": "woff", b"OTTO": "otf", b"\x00\x01\x00\x00": "ttf", b"ttcf": "ttc"}
css = open("icons.css").read()
pattern = r"data:[^;,]*(?:;[^;,]*)*;base64,([A-Za-z0-9+/=\s]+)"
for i, b64 in enumerate(re.findall(pattern, css)):
data = base64.b64decode(b64)
ext = SIGNATURES.get(data[:4], "bin")
with open(f"font-{i}.{ext}", "wb") as f:
f.write(data)
print(f"font-{i}.{ext}", len(data), "bytes")
拡張子を先頭 4 バイトから決めているのは、スタイルシートではフォントのラベルがいい加減なこと(application/font-woff、application/octet-stream)が多いからです。詳しくは Python での Base64 を参照してください。
よくある質問
CSS の Base64 からフォントを取り出すには?
@font-face ルール全体か、その url(data:…) の部分を上の入力欄に貼り付けてください。ツールが data URI を取り出してフォントをプレビューし、ファイルをダウンロード で形式に合った拡張子で保存します。
WOFF2 でファミリー名が「読み取らず」と表示されるのはなぜですか?
WOFF2 はすべてのフォントテーブルを Brotli で圧縮していて、このページはそれを展開しないため、name テーブルが読めないからです。それでもプレビューではフォントが描画されます。保存した後に fc-scan やフォントエディターを使えば名前を確認できます。
サンプルテキストが空白になる、または四角だらけになるのはなぜですか?
おそらく、フォントにその文字のグリフがありません。アイコンフォントは私用領域のコードポイントに記号を置いていますし、サブセット化された Web フォントは、あるページで必要だった文字だけしか含んでいないことがよくあります。フォントが実際にカバーしている文字を入力してください。
保存したフォントをインストールできますか?
TTF と OTF のファイルは、Windows、macOS、Linux にそのままインストールできます。WOFF と WOFF2 は Web 用の形式で、デスクトップの OS では一般に、先に TTF か OTF に変換する必要があります。そもそもフォントを使ってよいかどうかは、フォントのライセンスで決まります。