メインコンテンツへ移動

HTMLのエンコードとデコード

このツールは、テキストをHTML文字参照にエンコードし、元に戻すデコードを、すべてブラウザ内で行います。&や<のような名前付きエンティティが一般的なエスケープに対応し、AやAのような数値形式はあらゆるUnicode文字をカバーします。厳格デコードモードは、未知のエンティティをそのまま通す代わりに報告します。

端末内で処理

HTMLのエンコードとデコードとは

HTMLでは2つの文字に構造的な役割があります:&は文字参照の開始で、<はタグの開始です。これらの文字がテキストとして現れる場合はエスケープが必要で、その仕組みが文字参照です。&amp;のような短く曖昧でない表記で、パーサーはすべて元の文字に復元します。

標準で定められた名前付き参照リストは有限で閉じており、2,200以上の表記があります。そのうち5つがほとんどの作業を担います:&amp;、&lt;、&gt;、&quot;、&apos;です。リストにないものは、数値参照でコードポイントを直接記述します:&#65;と&#x41;はどちらも文字Aで、同じ手法でUnicodeのすべての文字に対応できます。

下のパネルは両方向に対応しています:一方のトグルでテキストをエンティティにエンコードし、もう一方でデコードします。スイッチで名前付きまたは数値の出力、厳格または寛容なデコードを選択できます。このサイトのすべてのツールと同様に、これはタブ内で完全に動作します。

ユーザーデータを運ぶリンクを構築する際に、この2つのエスケープ文法は出会います。そして、URLエンコーダとデコーダがパーセントエンコードの部分を処理します。

エンティティエスケープは文字とバイトのエンコードの家族の一員です。サイトのエンコードツール一覧がBase64からバイナリまで、残りを集めています。

ほとんどの作業を担う5つの名前付きエンティティ

どの文字をエスケープするかは文脈に依存します。テキストでは2つが必須です:リテラルの&は&amp;と書く必要があります。なぜなら、&の後に文字とセミコロンが続くと参照の始まりだからです。また、リテラルの<は&lt;と書く必要があります。さもなければタグを開始してしまうからです。残りの3つは文脈によるものですが、5つすべてを無条件にエスケープしても何も損はありません。

エンティティ出力必要な場合
&amp;&テキストでは常に必須――標準で要求されるエスケープ
&lt;<テキストで、タグを開始する前
&gt;>テキストではほとんど必要ありません――習慣的にエスケープ
&quot;"二重引用符で囲まれた属性値内
&apos;'一重引用符で囲まれた属性値内

名前付きと数値:一つの文字の二つの表記

数値参照はコードポイントそのものを記述します:&#65;はAの10進数、&#x41;は同じ文字の16進数です――HTML5ではセミコロンが必須で、xと16進数の大文字・小文字は区別されません。数値が直接コードポイントを指しているため、数値形式はUnicodeが定義するすべての文字、絵文字も含めてカバーします。

トレードオフはソースの可読性です:&eacute;は人間に何が描画されるか示しますが、&#233;は示しません。ここでの名前付きモードは通常のポリシーに従います:一般的な文字には名前を付け(&nbsp;、&mdash;、éは&eacute;)、あまり使われないものには数値を付けます。どちらの表記もデコード後は同じ文字になるため、区別はなくなります。

デコードモードと、厳格モードが報告する内容

方向トグルでパイプラインを切り替えます:エスケープされたマークアップを貼り付け、プレーンな文字を取得します。3つの表記すべて――名前付き、10進数、16進数――がデコードされ、名前付きルックアップでは大文字・小文字を区別しません。実際のマークアップは自己一貫していないためです。

未知のエンティティは誠実に処理されます。変換器は&npsp;――&nbsp;の典型的なタイプミス――を認識せず、デフォルトではそのままにします。なぜなら、テキストに legitimately なアンパサンドが含まれる可能性があるからです。厳格モードは完全にエスケープされていると主張されるマークアップ向けに存在します:そこでは未知のエンティティはバグであり、厳格デコードはタイプミスが生き残るのではなく、出力の上でそれぞれを報告します。

エスケープは装飾ではなく、セキュリティ境界です

この変換がタイポグラフィを超えて重要な理由は、インジェクションです。エスケープされずにページに表示されるユーザー提供のテキストはテキストとして表示されません:リテラルの<script>は実行され、エスケープされていない引用符は属性値から脱出します。エスケープはこれらのバイトを無力な文字に変えます――&lt;script&gt;は読み取り可能なテキストとして描画され、他には何も行いません。

これはURLエスケープとは別の仕事です:パーセントエンコーディングには独自の予約セットと文法があり、2つは交換可能ではありません――なぜなら別々のツールがあるからです。

よくある質問

エンコーダは私のテキストをサーバーに送信しますか?

いいえ。両方向とも、ページと一緒に読み込まれたJavaScriptが実行する文字列変換です。何も送信されません。サイトのContent-Security-Policyはconnect-src 'self'を設定しているため、ブラウザ自体が送信要求を拒否します。いずれにしても確認できます:DevToolsのネットワークパネルは沈黙を保ち、ツールはオフラインでも動作し続けます。

HTMLでは実際にどの文字をエスケープする必要がありますか?

テキストコンテンツでは2つが必須です:&を&amp;に、<を&lt;にします。テキストの>は許容されますが習慣的にエスケープされ、引用符は同じ引用符で区切られた属性値内でのみ意味を持ちます。このツールは5つすべてを無条件にエスケープするため、出力はどこでも安全です。

名前付きエンティティと数値エンティティの違いは何ですか?

名前付きエンティティは標準の閉じたリストからのラベルです――&amp;、&copy;、&eacute;。数値参照はコードポイントを直接記述し、10進数は&#65、16進数は&#x41です。両方とも同一の文字にデコードされます。数値はすべてのUnicodeコードポイントをカバーし、名前付きの方が読みやすいです。違いはソースを読む人間のためだけのものです。

厳格デコードモードは何を検出しますか?

未知の名前と不可能な数値です。厳格デコードは&npsp;――&nbsp;の典型的なタイプミス――や、有効な文字コードではない値を持つ数値参照を報告します。寛容モードは未知のエンティティをそのままにします。

エンティティはSEOやスクリーンリーダーに影響しますか?

いいえ。エンティティはHTMLパース中にデコードされ、検索インデックスやスクリーンリーダーがそれに気づく前です。DOMはいずれにしてもリテラルの文字を保持するため、&eacute;と&#233;は同一にランク付けされ、同一にアナウンスされます。ページを消費する機械ではなく、ソースを読む人間のために表記を選択してください。

なぜ私のアポストロフィが&apos;になりますか?

HTML5が&apos;を定義しているからです――何年もXMLのみのものでした。それが古い参照がそれを危険と呼ぶ理由です。また、一重引用符で囲まれた属性内のアポストロフこそが、それをエスケープする必要がある場所です。HTML5以前のコンシューマー向けには、&#39;という形式がすべてのパーサーが常に受け入れてきた形式です。