HTML エンティティをデコード

文字参照を含むテキストを貼り付けて、何と書いてあるかを読んでください。名前付き、10 進、16 進のすべてを認識します。もっと大事なのはやり方です。あなたのテキストを要素に入れてブラウザーに尋ねるのではなく、表で解決します。その違いが、デコードの最中に他人のマークアップが何かをできるかどうかを決めます。

結果

入力すると、ここに答えが出ます。

  • 処理される場所

    ファイルがないので、何もアップロードされません。計算はこのページの中で行われます。

  • 順番待ちもアカウントもなし

    お使いの機械の速さで答え、あなたが誰かを尋ねることはありません。

  • 何度でも

    回数は数えず、上限もありません。もう一度答えることに費用はかからないからです。

仕組み

  1. 文字参照を含むテキストを貼り付けてください。
  2. 結果を読みます。認識できないものや不完全なものは、黙って消える代わりにそのまま残ります。
  3. 必要な部分をコピーします。何も送信されていません。

パーサーではなく表で

エンティティを解決する分かりやすい方法は、テキストを要素に書き込んで `textContent` を読むことです。この種のツールの半数が自分に穴を開ける方法でもあります。テキストの中の `<img src=x onerror=...>` が本物の要素になり、やり方によってはネットワークリクエストが発生するかコードが実行されます。

ここでは起きません。HTML をどの段階でも生成しないからです。参照は表と照合し、数値参照は計算します。あなたのテキストがマークアップとして解釈される地点が存在しません。同じ理由で、このページはプレビューを提供できません。避けているものにちょうど戻ることになるからです。

3 つの形はどれも現れます

参照は `&` で始まり `;` で終わります。あいだに入るのは `amp` や `nbsp` のような名前、`#12354` のような井桁と 10 進数、`#x3042` のような井桁と `x` と 16 進数です。後ろの 2 つは同じ符号位置を 2 つの基数で書いたものです。

実務では 3 つが同じファイルに現れます。作った部品が別々だからです。CMS は名前付きに寄り、エクスポートは 10 進に、XML 系の道具は 16 進に寄ります。ここでは同じに扱うので、処理の鎖のどの部分がどれを好んだかを知る必要はありません。

欠けているセミコロン

ブラウザーは寛大です。セミコロンのない `&amp` を多くの文脈で同じように解決します。昔のページがそう書いていて、互換性が勝ったからです。この寛容さは HTML の標準にすら書かれていますが、限られた名前の一覧に対してだけで、属性値の中では効きません。

あなたにとっての意味は、データの中のセミコロンなしの `&amp` は時限装置だということです。処理系ごとに扱いが違うからです。このツールはセミコロンを要求し、不完全な参照はそのまま残します。目に見えて残るところが、何かが誤って生成された場所です。

2 回デコードしなければならないことがある理由

結果にまだ `&lt;` が残っているなら、入力は二重にエンコードされていました。`&amp;lt;` を含んでいて、1 回の処理が正しく `&lt;` を作ったのです。中途半端な結果ではなく正しい結果です。エンティティらしきものがなくなるまで進むデコーダーは、`&lt;` が意図的に書かれていたテキストも壊します。

きれいなやり方は、そうしていると分かったうえでもう一度通すことです。日常的に 2 回必要なら、本当の仕事はここを 2 回押すことではなく、生成する鎖の中の二重エンコードを見つけることです。

二重のエンティティはどこから来るのか

ほとんどは、エスケープされた状態で保存された値を、テンプレートエンジンが表示時にもう一度エスケープした結果です。2 つの段はそれぞれ正しく、正しくないのは 2 つあることです。気づくのは最終ページだけで、そこで利用者が `&nbsp;` をテキストとして読みます。

2 つめの出どころは移行とインポートです。古いシステムのデータがすでにエスケープされた状態で届き、新しい処理がそれを生のものとして扱います。これも、ほかのエンティティ名の前に付いた `&amp;` で見分けられます。層が 2 枚重なっている署名です。

2000 を超える名前と、閉じられた一覧

HTML5 は 2,200 を超える名前付き参照を定義しています。`&amp;` や `&copy;` から、ほとんど誰も書かない数学記号まで。この一覧は意図的に凍結されています。新しいものを足せば、すでに存在する文書の意味が変わるからです。

実務上は、ここで解決しない名前は綴りが違うか、そもそも存在しなかったかのどちらかです。新しい文字にはもう名前が付きません。2014 年以降に Unicode が追加したものすべてに対して、存在するのは数値形だけです。`&emoji;` は一度も存在したことがなく、これからも存在しません。

基本多言語面を超える数値参照

`FFFF` を超える符号位置——絵文字、まれな文字体系、一部の数学記号——は、JavaScript の内部では 2 つの単位、サロゲートペアを必要とします。それを考慮しないデコーダーは、1 つの完全な文字の代わりに壊れた半分を 2 つ作ります。

ときには、サロゲートペアの片割れをそれぞれ別に書いた参照も現れます。古い道具がそう符号化したためです。それらは厳密には不正な Unicode です。ここでは黙って置換文字に変えることはしません。問題が表示ではなく出どころにあることが見えるようにするためです。

見えない空白

`&nbsp;` は空白に見えて空白ではない文字になります。符号位置は `20` ではなく `A0` です。だからあとで比較が失敗し、置換が当たらず、`trim()` が効きません。画面上には怪しいところが何もないのに。

日本語のデータではもうひとつ厄介なものが加わります。`&#12288;` が生む全角スペース、U+3000 です。半角スペースとは別の文字で、CMS やワープロから貼られたテキストに気前よく混ざります。「明らかに同じ」2 つの値が等しく比較されないとき、最初に見るべきはこの 2 つです。

個人情報保護法から見たときの位置

この欄には第三者のテキストが頻繁に届きます。データベースの抜粋、問い合わせのチケット、氏名や住所を含むフィードの項目。解決はページの中で行われるので、そのいずれも当方へ提供されず、委託も生じません。

あわせて覚えておく価値があります。デコードされたテキストは、定義上、エスケープされたものより無害ではありません。エスケープが保護だったからです。それをページに戻す人は、行き着く場所に合わせてもう一度エスケープしなければなりません。これは読むための道具であって、HTML を配信する鎖の最終段ではありません。

HTML エンティティをデコード:よくある質問

結果にまだ `&lt;` が出るのはなぜですか。

入力が二重にエンコードされていて `&lt;` を含んでいたからです。1 回の処理が正しく `<` を作りました。必要ならもう一度通し、そのあと生成する鎖の中で二重にエスケープしている段を探してください。

セミコロンのない `&amp` が解決されないのはなぜですか。

セミコロンがなければ参照が一意に決まらないからです。ブラウザーは互換性のために寛大ですが、その寛大さは一様ではありません。ここではそのまま残し、何が誤って生成されたのかが見えるようにしています。

他人のマークアップがここで何かできますか。

いいえ。参照は表と照合し、数値参照は計算します。HTML はどの段階でも生成されません。同じ理由で、描画されたプレビューもありません。

`&nbsp;` から出てくる見えない文字は何ですか。

符号位置 A0 のノーブレークスペースです。普通の空白に見えて別の文字なので、比較も置換も空白の削除もそれを空白として扱いません。日本語のデータでは全角スペース、U+3000 も同じ問題を起こします。

テキストは端末から出ますか。

いいえ。すべてこのページの中で起こります。デコードしているサーバーは存在しません。入力しているあいだ、ネットワークパネルがそれを裏づけます。

他のツール