android - Android 的 Html.escapeHtml 和 TextUtils.htmlEncode 有什么区别?我什么时候应该使用一个或另一个?

标签 android android-webview html-entities html-encode html-escape

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;
    

所以看起来第二个转义/编码引号 ("),但第一个没有,虽然第一个编码了欧元符号,但第二个没有。我是困惑。


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

最佳答案

你可以比较他们的来源:

这就是 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 位 channel 传输的文本也能正常工作,请使用 Html.escapeHtml

至于引号字符 (") 的不同处理方式——它只需要在属性值内进行转义(参见 the spec ),所以如果您不将文本放在那里,你应该没事。

因此,我个人的选择是 Html.escapeHtml,因为它似乎更通用。

关于android - Android 的 Html.escapeHtml 和 TextUtils.htmlEncode 有什么区别?我什么时候应该使用一个或另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35104032/

相关文章:

layout_width 和 android :layout_weight manipulations with gaps (margins) and paddings

android - 如何处理 Timer was cancelled 错误?

android - 如何使用fragments在一个屏幕上打开两个webview

php - Laravel html_entity_decode 使用 UTF-8

php - html_entity_decode 也会替换吗?如果不行怎么换?

Android:this.getApplication() 返回 NULL 指针

android - ViewPager - 获取下一页的部分 View

java - Webview加载url但在默认浏览器中打开内容?

android - 如何让按钮出现在 CoordinatorLayout 内的 WebView 下方

php - 如何将 Unicode 特殊字符转换为 html 实体?