data URI を作成する手順
- モードを選びます。テキストから(既定)は入力または貼り付けたものをエンコードします。ファイルから は、ドロップ、貼り付け、選択した任意の種類のファイルを扱います。解析 は逆方向で、URI を分解します。
- テキストから では、MIME タイプ(たとえば
text/cssやapplication/json)、文字コード、エンコード方式(Base64 か URL エンコード)を設定します。ファイルから では、MIME タイプはファイルから自動で入力され、編集もできます。 - 出力形式 を選びます。Data URI、CSS の
url()、ダウンロード名付きの HTML<a>、Markdown があり、画像なら HTML<img>、フォントなら@font-faceも表示されます。 - 出力をコピー を押します。ファイルをダウンロード でペイロードそのものを保存し、.txt で保存 で出力テキストを保存します。
ボタンの下の ペイロード はデータのサイズ、URI の長さ は結果のサイズ、オーバーヘッド はその差をパーセントで表します。
data URI の構文
data URI はファイル全体を 1 つの URL に詰め込みます。
data:[<media type>][;charset=<charset>][;base64],<data>
| 部分 | 例 | 補足 |
|---|---|---|
| メディアタイプ | image/png、text/css | 省略可。空なら text/plain;charset=US-ASCII |
| パラメータ | ;charset=utf-8 | テキスト系のタイプ用。;key=value の組をさらに追加可能 |
;base64 | ;base64 | データが Base64 であることを示す。なければパーセントエンコード |
| データ | カンマの後 | ペイロード |
例をいくつか示します。
| Data URI | 中身 |
|---|---|
data:,Hello%2C%20World%21 | テキスト Hello, World!、タイプは暗黙 |
data:text/plain;charset=utf-8;base64,SGVsbG8sIFdvcmxkIQ== | 同じテキストの Base64 |
data:text/css,body%7Bcolor:%23333%7D | URL エンコードした CSS ルール |
data:application/json;base64,eyJvayI6dHJ1ZX0= | {"ok":true} |
データが空でもカンマは必須です。data:, は有効な空の URI です。
Base64 か URL エンコードか
どちらのエンコード方式でも有効な URI になりますが、サイズと読みやすさが異なります。
| ペイロード | Base64 の URI | URL エンコードの URI |
|---|---|---|
text/plain;charset=utf-8 の Hello, World! | 57 文字 | 45 文字 |
text/css の body{color:#333} | 45 文字 | 36 文字 |
application/json の {"ok":true} | 45 文字 | 41 文字 |
text/html;charset=utf-8 の <h1>Héllo</h1> | 56 文字 | 56 文字 |
プレーンな ASCII テキストは URL エンコードのほうが短く、ソース上でも読めます。ASCII 以外のバイトはそれぞれ 3 文字かかる(é は %C3%A9)ので、日本語などほかの文字体系のテキストではすぐに Base64 のほうが有利になります。画像、フォント、PDF などのバイナリファイルには Base64 を使ってください。バイナリデータに URL エンコードを選ぶと、生成ツールが警告します。
ここでの URL エンコードは控えめです。英字、数字、- . _ ~ ! $ * + , ; = : @ / ? はそのまま残し、#、%、引用符、括弧、空白を含むそれ以外はすべてエスケープします。エスケープしない # があると、ブラウザはそれをフラグメントの始まりと読むため、URI がそこで終わってしまいます。SVG には、さらに短い 3 つ目の選択肢が SVG から Data URI へ にあります。
data URI が使える場所
- 画像:
<img src>、CSS のbackground-image、<link rel="icon">、動画のposter。 - フォント:
@font-faceのsrc。小さなアイコンフォント 1 つに便利です。MIME タイプがフォントなら、生成ツールがルールを組み立てます。 - ダウンロード:
<a href="data:..." download="report.csv">で、サーバーなしでページ内で生成したファイルを渡せます。 - スタイルシートとスクリプト:ページの Content Security Policy がそれらに
data:を許可していれば、<link href>や<script src>で読み込めます。 - テスト用のフィクスチャや JSON ペイロード:小さなファイルをインラインで入れたい場合です。
どこでも使えるわけではありません。Chrome と Firefox は、ページから始まるタブ全体の data: URL への遷移をブロックするので、data:text/html,... へのリンクはクリックしても何も起きません。Content Security Policy では、img-src、font-src など該当するディレクティブに data: を含める必要があります。Gmail をはじめ多くの Web メールクライアントは data URI の画像を完全に取り除きます。メールの Base64 をご覧ください。
サイズとパフォーマンス
Base64 はバイナリデータを約 33% 大きくします。さらに URI はそれを含むページやスタイルシートのたびに繰り返され、独自のキャッシュエントリを持ちません。数キロバイトの小さなアセットなら割に合いますが、写真には向きません。具体的な数値は data URI のパフォーマンス で説明しています。特に画像なら、画像から Base64 へ でエンコード前にリサイズや変換ができます。
コードで data URI を作る
JavaScript で URL エンコードしたテキスト:
const uri = "data:text/plain;charset=utf-8," + encodeURIComponent("Prices: 5 € & up");
// data:text/plain;charset=utf-8,Prices%3A%205%20%E2%82%AC%20%26%20up
Python で Base64 の JSON:
import base64, json
obj = {"name": "Ada", "langs": ["en", "fr"]}
uri = "data:application/json;base64," + base64.b64encode(json.dumps(obj).encode()).decode()
# data:application/json;base64,eyJuYW1lIjogIkFkYSIsICJsYW5ncyI6IFsiZW4iLCAiZnIiXX0=
詳しくは JavaScript での Base64 と Python での Base64 をご覧ください。どこかで見つけた data URI を調べるには、Data URI パーサー を使ってください。
よくある質問
data URI と data URL の違いは何ですか?
実質的な違いはありません。RFC 2397 ではこれを “data” URL スキームと呼び、ブラウザと Fetch 標準も data URL と呼んでいます。data URI は、同じ data: 構文を指す、より古くて同じくらい一般的な名前です。
Base64 ではなく URL エンコードを使うべきなのはどんなときですか?
CSS、JSON、SVG のような短くてほぼ ASCII のテキストなら、URL エンコードのほうが短くなることが多く、読みやすさも保てます。バイナリファイルでは、パーセントエンコードがほとんどのバイトを 3 文字にしてしまうため、常に Base64 のほうが小さくなります。
data URI に ;charset=utf-8 は必要ですか?
ASCII 以外の文字を 1 つでも含むテキストなら必要です。指定がないと text/plain の data URI は既定で US-ASCII になり、é や € が 2〜3 文字の誤った文字になることがあります。画像などのバイナリのタイプには文字コードを付けません。
data: リンクをクリックしても何も開かないのはなぜですか?
Chrome と Firefox は、ページがタブ全体を data: URL に遷移させることをブロックしています。フィッシングに広く使われていたからです。画像、スタイルシート、フォント、<a download> によるダウンロードは今でも機能します。
data URI にサイズの上限はありますか?
上限はブラウザによって異なり、画像に対してはかなり余裕がありますが、非常に長い URI はページを遅くし、途中で切ってしまうツールもあります。生成ツールは 2 MB を超えると警告します。それほど大きなものは、ファイルへのリンクにしてください。