Android 有两种不同的方法来转义/编码字符串中的 HTML 字符/实体:
-
Html.escapeHtml(String) http://developer.android.com/reference/android/text/Html.html#escapeHtml(java.lang.CharSequence),在 API 16 (Android 4.1) 中添加。文档说:
返回给定纯文本的 HTML 转义表示形式。
-
TextUtils.htmlEncode(String) http://developer.android.com/reference/android/text/TextUtils.html#htmlEncode(java.lang.String)对于这一点,文档说:
Html 对字符串进行编码。
阅读文档,它们似乎都做了几乎相同的事情,但是,在测试它们时,我得到了一些非常神秘的(对我来说)输出。
例如。随着输入:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
-
Html.escapeHtml
gives:
<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
-
Whereas TextUtils.htmlEncode
gives:
<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
所以看来第二个转义/编码了引号("),但第一个没有,尽管第一个编码了欧元符号,但第二个没有。我很困惑。
那么这两种方法有什么区别呢?每个转义/编码哪些字符?有什么区别encoding and escaping这里 ?我什么时候应该使用其中之一(或者我应该,喘气,一起使用它们?)?
您可以比较它们的来源:
这是什么Html.escapeHtml
下面使用:
https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/java/android/text/Html.java#L387 https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/java/android/text/Html.java#L387
This is TextUtils.htmlEncode
:
https://github.com/android/platform_frameworks_base/blob/d59921149bb5948ffbcb9a9e832e9ac1538e05a0/core/java/android/text/TextUtils.java#L1361 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
.
至于引号字符的不同处理("
) -- 只需要在属性值中转义(参见the spec https://www.w3.org/TR/html4/charset.html#h-5.3.2),所以如果您不将文本放在那里,应该没问题。
因此,我个人的选择是Html.escapeHtml
,因为它似乎更通用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)