13

Android には、文字列内の HTML 文字/エンティティをエスケープ/エンコードする 2 つの方法があります。

  • Html.escapeHtml(String)、API 16 (Android 4.1) で追加されました。ドキュメントは言う:

    指定されたプレーン テキストの HTML エスケープ表現を返します。

  • TextUtils.htmlEncode(String)これについては、ドキュメントは次のように述べています。

    文字列を HTML エンコードします。

ドキュメントを読むと、どちらもほとんど同じことをしているように見えますが、テストすると、(私にとっては) かなり不思議な出力が得られます。

例えば。入力で:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>

  • Html.escapeHtml与えます:

    &lt;p&gt;This is a quote ". This is a euro symbol: &#8364;. &lt;b&gt;This is some bold text&lt;/b&gt;&lt;/p&gt;
    
  • 一方TextUtils.htmlEncode、与えます:

    &lt;p&gt;This is a quote &quot;. This is a euro symbol: €. &lt;b&gt;This is some bold text&lt;/b&gt;&lt;/p&gt;
    

したがって、2 番目は引用符 ( " )をエスケープ/エンコードするようですが、最初はそうではありません。1 番目はユーロ記号をエンコードしますが、2 番目はそうではありません。混乱しています。


では、これら2つの方法の違いは何ですか? それぞれがどの文字をエスケープ/エンコードしますか? ここでのエンコーディングエスケープの違いは何ですか? いつどちらか一方を使用する必要がありますか (または、あえぎ、両方を一緒に使用する必要がありますか?)?

4

1 に答える 1

19

ソースを比較できます。

これはHtml.escapeHtml下で使用するものです:

https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/java/android/text/Html.java#L387

これはTextUtils.htmlEncode次のとおりです。

https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/java/android/text/TextUtils.java#L1361

ご覧のとおり、後者は HTML でマークアップ用に予約されている特定の文字のみを引用しますが、前者は非 ASCII 文字もエンコードするため、ASCII で表現できます。

したがって、入力にラテン文字しか含まれていない場合 (これは最近ではほとんどありません)、または HTML ページに Unicode を適切に設定しており、TextUtils.htmlEncode. 一方、7 ビット チャネル経由で送信された場合でもテキストが機能することを確認する必要がある場合は、Html.escapeHtml.

引用符文字 ( ") の別の扱いについては、属性値内でエスケープする必要があるだけなので (仕様を参照)、そこにテキストを配置しない場合は問題ありません。

したがって、私の個人的な選択はHtml.escapeHtml、より用途が広いように見えるためです。

于 2016-01-30T17:17:34.280 に答える