HTML エンティティ
HTML で特殊文字を表現するための文字参照。& で始まり ; で終わる記法。
HTML エンティティとは、HTML 文書内で特殊文字を安全に表現するための文字参照です。HTML の構文で特別な意味を持つ文字 (<、>、& など) をそのまま記述するとブラウザがタグや構文として解釈してしまうため、エンティティを使って「文字としての表示」を明示します。代表的なものに & (&)、< (<)、> (>)、" (")、' (') があります。
HTML エンティティには名前参照と数値参照の 2 種類があります。名前参照は & のように人間が読みやすい形式で、HTML 仕様で定義された名前付きエンティティは 2026 年 8 月時点で 2,231 件あります。うち 106 件は & や < のように末尾のセミコロンを省いた形も定義されており、ブラウザはこれらを旧来の互換として解釈します。自作のサニタイザで「& で始まり ; で終わる形」だけを想定すると、この省略形をすり抜けさせてしまう点に注意が必要です。数値参照は 10 進数 (&) または 16 進数 (&) で Unicode コードポイントを直接指定する形式で、名前が定義されていない文字でも表現できます。
Web セキュリティの観点では、HTML エンティティへの変換 (エスケープ) は XSS (クロスサイトスクリプティング) 対策の基本です。ユーザー入力を HTML に出力する際、<、>、&、"、' の 5 文字を必ずエンティティに変換しなければなりません。この処理を怠ると、悪意のあるスクリプトが注入されるリスクがあります。多くの Web フレームワークはテンプレートエンジンで自動エスケープ機能を提供していますが、innerHTML や dangerouslySetInnerHTML を使う場面では開発者が明示的にエスケープする必要があります。
ただし「5 文字を変換すれば安全」と考えるのは危険です。エスケープが有効なのは、出力先が HTML の本文か、クォートで囲まれた属性値である場合に限られます。属性値をクォートで囲まずに出力すると、空白やバッククォートで属性の境界を作られてしまい、5 文字を変換していても属性を追加されます。さらに <script> の内側、href や src の URL 部分、インライン CSS の内側では、HTML エンティティへの変換は防御になりません。これらは JavaScript 文字列としてのエスケープ、URL としての検証、それぞれ別の処理が必要です。「どの文脈へ出力するか」でエスケープ方法を選ぶ、が実務上の判断基準になります。
実務でよく使われるエンティティには、ノーブレークスペース ( )、著作権記号 (©)、商標記号 (™)、矢印 (→)、数学記号 (×、÷) などがあります。特に は連続するスペースを表示したい場合や、テーブルの空セルに内容を持たせたい場合に頻繁に使用されます。ただし が展開される U+00A0 は通常の半角スペース (U+0020) とは別の文字です。文字列比較では「a b」と「a b」が一致しないため、コピーした文章に紛れ込むと検索に引っかからない、数値の桁区切りとして混入してパースに失敗するといった不具合の原因になります。名前のとおり改行も禁止するので、長い語句に多用すると折り返しが効かず横にはみ出します。空セルの高さを保つ目的なら、現在は CSS の empty-cells や min-height で対処するほうが素直です。
よくある誤解として、「UTF-8 を使っていればエンティティは不要」というものがあります。確かに UTF-8 であれば日本語や絵文字をそのまま記述できますが、HTML の構文文字 (<、>、&) のエスケープは文字エンコーディングに関係なく必須です。また、HTML 属性値内のダブルクォート (") も " に変換する必要があります。
文字数カウントの観点では、HTML エンティティはソースコード上の文字数とブラウザ表示上の文字数に乖離を生じさせます。& はソースコードでは 5 文字ですが、ブラウザでは 1 文字の「&」として表示されます。 は 6 文字が 1 文字のスペースになります。HTML ソースの文字数を数える場合と、レンダリング後のテキストの文字数を数える場合では結果が大きく異なるため、文字数カウントツールがどちらを対象としているかを意識することが重要です。