HTMLエンティティ変換(エンコード・デコード)
HTMLがマークアップとして扱う文字をエスケープします。必要に応じて非ASCII文字もすべて変換でき、éや—などのエンティティを通常のテキストに戻すこともできます。どちらの方向もブラウザ内で処理され、デコードした入力がHTMLとして描画されることはありません。
0 文字 · 0 語 · 0 行
0 文字 · 0 語 · 0 行
すべてこのブラウザのタブ内で処理されます。テキストがアップロードされたり保存されたりすることはありません。
よく使う文字とそのエンティティ
名前付き、10進、16進のどの形式も同じ文字にデコードされます。エンコーダーは一般的な名前付きエンティティ 216 個に対応し、デコーダーは HTML 標準のすべての名前付き参照を理解します。
| 文字 | 名前付き | 10進 | 16進 |
|---|---|---|---|
& | & | & | & |
< | < | < | < |
> | > | > | > |
" | " | " | " |
' | ' | ' | ' |
(ノーブレークスペース) | |   |   |
© | © | © | © |
® | ® | ® | ® |
™ | ™ | ™ | ™ |
€ | € | € | € |
£ | £ | £ | £ |
¥ | ¥ | ¥ | ¥ |
— | — | — | — |
– | – | – | – |
… | … | … | … |
« | « | « | « |
» | » | » | » |
° | ° | ° | ° |
× | × | × | × |
÷ | ÷ | ÷ | ÷ |
é | é | é | é |
π | π | π | π |
→ | → | → | → |
😀 | — | 😀 | 😀 |
HTML 4の252個からHTML5の2,231個へ
文字参照は、ASCII文字だけで任意の文字を書き表す方法です。数値参照はあらゆるUnicodeコードポイントに使え、10進数(é)でも16進数(é)でも書けます。名前付き参照は覚えやすく、HTML 4では252個が定義されており、éのようなLatin-1の文字、ギリシャ文字、数学記号、—や…といった約物が含まれます。意外なことに'はその中に入っていませんでした。これはXML由来で、HTMLで正式に使えるようになったのはHTML5からです。
HTML5ではMathMLの実体セットを取り込み、名前付き文字参照が2,231個に増えました。そのため✓、★、≂̸などの名前も、現在のすべてのブラウザーで使えます。この数には、&や©のようにセミコロンを省いた従来の書き方も含まれます。パーサーは互換性のために受け付けますが、自分で書くのは避けてください。ここのエンコーダーは、広く対応しているHTML 4の名前と'を出力し、それ以外の文字は数値参照に切り替えます。デコーダーはテキストをブラウザー自身のパーサーに渡すので、2,231個の名前すべてに対応しています。
エスケープすべき文字と、エスケープだけでは足りない場面
Only & < > " ' は日常の作業向けの設定です。テキストノードや引用符付き属性を終わらせてしまう可能性のある5文字をエスケープするので、ページにコードサンプルを表示したり、ユーザーの入力テキストをHTMLに安全に埋め込んだりするには十分です。Also every non-ASCII character は、é、€、絵文字も参照に変換します。古いメールテンプレートや文字コードが壊れるシステムなど、UTF-8を扱えないまれな経路向けです。Named、Decimal、Hex は参照の書き方が違うだけで、3つとも同じ文字にデコードされます。UTF-8で保存したページなら、アクセント付き文字にエンティティは不要です。
エスケープが守るのはHTMLの文脈だけです。scriptブロック、onclickのようなインラインイベントハンドラー、style属性、javascript:で始まる可能性のあるhrefに入れるテキストは別の対処が必要で、エンティティ化だけではクロスサイトスクリプティングを防げません。Reactなどのフレームワークは標準でテキストをエスケープするため、最近のアプリでは二重エスケープのほうがよくある不具合です。アンパサンドのはずの場所に&と表示されてしまいます。タグを完全に取り除きたい場合はHTMLをTXTに変換でマークアップを変換してください。URL内のエスケープにはURLエンコード・デコードを使います。
よくある質問
- HTMLでエスケープが必要な文字は?
- テキスト内では&と<が必須で、>は慣例としてエスケープします。属性値の中では、その値を囲んでいる引用符もエスケープしてください。5文字すべてをエスケープすれば、どちらの場合にも対応できます。
- と通常のスペースの違いは?
は改行しない空白(U+00A0)です。見た目は空白ですが、その位置での改行を防ぎ、HTMLの通常の空白と違って複数並べても1つにまとめられません。- ページに&ではなく&と表示されるのはなぜですか?
- テキストが二重にエスケープされています。データの時点で1回、テンプレートやフレームワークでもう1回行われた状態です。生のテキストを保存しておき、出力時にテンプレートなど1つの層だけでエスケープするようにしてください。
- 信頼できない提供元のHTMLをここでデコードしても安全ですか?
- はい。デコーダーは入力をプレーンテキストとして解析するので、タグは生成されず、スクリプトも実行されず、画像も読み込まれません。変換されるのはエンティティ参照だけです。
- 名前付きエンティティと数値エンティティはどちらがよいですか?
- 名前付き参照は読みやすく、数値参照はすべての文字とすべてのXMLパーサーで使えます。DTDのないXMLで事前に定義されているのは、
&、<、>、"、'だけです。