HTML を Base64 にエンコードする方法
- 入力 · テキスト にマークアップを貼り付けるか、サンプル を押して小さな文書を入れます。
- 出力 · Base64 から Base64 をコピーします。
- 文字コード は UTF-8 のままにし、Data URI か文書の中で UTF-8 を宣言します(下記参照)。
- Data URI が必要なら先頭に
data:text/html;charset=utf-8;base64,を付け、API のフィールドが求めているなら Base64 だけを貼り付けます。
2 行のサンプル <!doctype html> と <h1>Hello from base64hub</h1> は PCFkb2N0eXBlIGh0bWw+CjxoMT5IZWxsbyBmcm9tIGJhc2U2NGh1YjwvaDE+ にエンコードされます。Base64 を HTML に変換 で元に戻せます。
例
| HTML | Base64 |
|---|---|
<h1>Hi</h1> | PGgxPkhpPC9oMT4= |
<p>café</p> | PHA+Y2Fmw6k8L3A+ |
<b>Total: 5 €</b> | PGI+VG90YWw6IDUgJmV1cm87PC9iPg== |
€ のようなエンティティは Base64 にとってはただのテキストで、そのまま残ります。ブラウザがデコード後に解決します。PCFkb2N0eXBl や PCFET0NUWVBF で始まる文字列は HTML 文書(<!doctype または <!DOCTYPE)で、PGh0bWw は <html です。
data:text/html の URI を組み立てる
完全な Data URI は、スキーム、メディアタイプ、省略可能な文字コード、Base64 フラグの 4 つの部分からなります。
data:text/html;charset=utf-8;base64,PHA+Y2Fmw6k8L3A+
URI に charset=utf-8 がなく、文書にも <meta charset="utf-8"> がないと、ブラウザがバイト列をレガシーな文字コードで読み、café が café と表示されることがあります。HTML の中に meta タグを入れておけば、文書がどこに置かれても守られます。
よくある用途:
- iframe では、
<iframe src="data:text/html;base64,...">の形で別ファイルなしに完結したスニペットを表示できます。手書きの HTML なら、エンコードがまったく要らないsrcdoc属性のほうが簡単なことも多いです。 - ブラウザのテストなどの自動化では、Web サーバーなしに Data URI からフィクスチャのページを読み込めます。
- メール、PDF 生成、文書の API の中には、引用符や改行を JSON でエスケープせずに済むよう、HTML 本文を Base64 のフィールドで受け付けるものがあります。
ブラウザは、Web ページがメインウィンドウを data:text/html の URL に遷移させることを許可しません。そのため、そうした URL へのリンクやリダイレクトは何も起きずに失敗するか、エラーが表示されます。iframe は影響を受けません。
サイズと代替手段
Base64 にするとマークアップは約 3 分の 1 大きくなります。49 バイトの文書 <!doctype html><meta charset="utf-8"><p>café</p> は 68 文字になります。ほぼ ASCII だけの HTML なら、エスケープが必要なのは #、%、非 ASCII のバイトなど一部の文字だけなので、パーセントエンコードした Data URI のほうが短くなることがよくあります。マークアップが大きい場合、特殊文字が多い場合、Base64 しか受け付けないフィールドに入れる場合は、Base64 のほうが安全です。Data URI 生成ツール は HTML、CSS、画像の data: リンクを作り、Data URI のパフォーマンス ではキャッシュとサイズのトレードオフを解説しています。
コードで HTML を Base64 に変換する
import base64
html = '<!doctype html><meta charset="utf-8"><p>café</p>'
uri = "data:text/html;charset=utf-8;base64," + base64.b64encode(html.encode("utf-8")).decode()
// Node.js
const html = "<p>café</p>";
const uri = "data:text/html;charset=utf-8;base64," + Buffer.from(html, "utf8").toString("base64");
// "data:text/html;charset=utf-8;base64,PHA+Y2Fmw6k8L3A+"
ブラウザでは、JavaScript の Base64 にある TextEncoder を使う方法を使ってください。btoa だけでは非 ASCII 文字が化けるか、拒否されます。Python の Base64 もご覧ください。
よくある質問
HTML から Data URI を作るには?
ここで HTML をエンコードし、結果を data:text/html;charset=utf-8;base64, の後ろに付けます。たとえば <h1>Hi</h1> は data:text/html;charset=utf-8;base64,PGgxPkhpPC9oMT4= になります。
ページから data:text/html のリンクを開けないのはなぜですか?
現在のブラウザは、フィッシング対策として、Web ページがメインウィンドウを data:text/html の URL に遷移させることをブロックします。代わりに iframe で読み込むか、自分でアドレスバーに貼り付けて開いてください。
Base64 は HTML エンコードと同じですか?
違います。HTML エンコード(エンティティ)は < を < に変えて、マークアップをテキストとして表示させるものです。Base64 は文書全体を英数字に変えて運べるようにします。エンティティには HTML エンティティのツール を使ってください。
Base64 にすれば HTML のソースを隠せますか?
隠せません。誰でも数秒でデコードできますし、ブラウザも描画するためにどのみちデコードします。