13

Android 有两种不同的方式来转义/编码字符串中的 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;
    

所以似乎第二个转义/编码引号("),但第一个没有,虽然第一个编码欧元符号,但第二个没有。我很困惑。


那么这两种方法有什么区别呢?每个转义/编码哪些字符?这里的编码转义有什么区别?我什么时候应该使用其中一种(或者我应该,喘着粗气,同时使用它们?)?

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 回答