インターフェースデバッグ時にHTMLエンティティのエンコード/デコード結果が正しくない場合の対処法
インターフェースデバッグでHTMLエンティティのエンコード/デコード結果が正しくない場合、通常はツールが壊れているのではなく、入力タイプ、エスケープ階層、文字セットを間違えているのが原因です。まず元のデータがHTMLエンティティなのか、URLエンコードなのか、JSONエスケープなのかを確認し、それに対応するデコード方法を選べば、ほぼ正しい結果が得られます。
インターフェースのレスポンスに &、'、< のような断片が現れたとき、多くの人はまずツールに直接貼り付けてデコードしようとします。しかし、この内容自体がすでに一度エスケープされている場合、もう一度デコードすると誤った結果になります。以下では調査順序に沿って、特定と修正の方法を説明します。
まずデータがどのエンコードかを判断する
HTMLエンティティは &name; または &#数字; 形式のプレースホルダーで、ブラウザがレンダリングするときに初めて文字に復元されます。これはURLエンコード(%20)やJSON文字列エスケープ(\"、\u4e2d)とは異なるレベルのものです。タイプを間違えると、デコード結果も当然正しくなりません。
次の順序で確認できます:
- 文字の形態を見る:
&...;があればHTMLエンティティ、%と2桁の16進数があればURLエンコード、バックスラッシュがあればJSONまたはプログラミング言語のエスケープです。 - エスケープの階層数を数える:
&amp;が連続して現れる場合は2回エスケープされているので、&に復元するには2回デコードする必要があります。 - 文字セットを確認する:インターフェースがUTF-8を宣言しているのに実際はGBKで返している場合、デコード後に疑問符や四角形が現れます。
- 二重包装されていないか確認する:一部のインターフェースはHTML断片をJSONフィールドに入れているので、先にJSONを解いてからエンティティを解きます。
ブラウザでローカル動作するHTMLエンティティエンコード/デコードツールはデータをアップロードしないので、インターフェースのレスポンス断片を貼り付けて比較テストするのに適しています。
HTMLエンティティのエンコード/デコードと文字エスケープの違い
HTMLエンティティのエンコード/デコードと文字エスケープの違いは適用範囲にあります。エンティティのエンコード/デコードはHTML文書内の &...; プレースホルダーを処理し、文字エスケープは言語や伝送層における文字列の特殊文字表現を処理します。どちらも曖昧さを避けることが目的ですが、階層が異なります。
HTMLエンティティのエンコード/デコードと文字エスケープの違いは可逆性にも現れます。エンティティのエンコード/デコードは通常1対1のマッピングで、< は `