Android 的 Html.escapeHtml 和 TextUtils.htmlEncode 之间有什么区别?我什么时候应该使用其中之一?

2024-01-01

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:

    &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;
    
  • Whereas TextUtils.htmlEncode gives:

    &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;
    

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


那么这两种方法有什么区别呢?每个转义/编码哪些字符?有什么区别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(使用前将#替换为@)

Android 的 Html.escapeHtml 和 TextUtils.htmlEncode 之间有什么区别?我什么时候应该使用其中之一? 的相关文章

随机推荐

  • Java 中的 Byte 和 Short 的要点(我已阅读其他问题)

    我的问题是 如果我从 Java 反汇编中得到它 当我使用 byte a 3 b 5 System out println a b 实际上会使用 int 而不是 byte 此外 所有本地内存插槽都是 4B 就像堆栈插槽一样 我意识到分配一个字
  • 为什么我的角度应用程序在更改支持 mat-tree 的数据后变得非常慢?

    我正在实现角度 材料树组件并遇到一些问题 保存对树的更改后 我正在重置支持树的数据 有效 但是应用程序变得非常慢 扩展节点可能需要大约 8 秒 更奇怪的是 实际操作数据源的代码是在其他地方运行的 例如向树中添加新的子项 我们希望 UI 更新
  • 在 iOS 上显示按比例间隔的数字(而不是等宽/表格)

    我在 iOS 中渲染数字 目标为 7 及以上 方法是将它们存储在 NSAttributedString 中并使用 drawAtPoint 进行渲染 我正在使用 Helvetica Neue 我注意到这样画出的数字的位数不成比例 字形都具有相
  • 在 Kivy 中将图像对象作为按钮背景传递

    在Kivy中 有没有办法将图像对象作为按钮背景而不是图像文件名传递 button background normal属性仅接受字符串 我想自定义图像属性 例如allow stretch False 如果成功 我如何指定按钮内的图像对齐方式
  • 对于 64 位应用程序,.NET 使用 WSAStartup 是否安全?

    对于 64 位应用程序 NET Framework 版本和 WSAData 结构的本机 Win32 版本之间不匹配 因为字段的顺序不同 我已经复制了 NET 版本以用于我们基于 C 的产品 但一位同事担心我造成了内存损坏 使用 DllImp
  • Python+OpenCV+py2app:numpy.core.multiarray 导入失败

    环境 mac os x 10 7 5 xcode 4 2 1 python 2 7 5 opencv 2 4 7 py2app 0 7 3 我正在尝试使用 py2app 打包一个基于 opencv 的简单 python 脚本 但构建的应用程
  • 如何使工具提示保持不变,以便可以单击其中的链接

    我有 jQuery 插件 Tooltipsy 来生成链接的工具提示 在此工具提示中 我有相关对象的其他链接 我希望它在初始链接上方弹出 并在我将鼠标移至其上单击链接时停留 这可能吗 有谁知道该怎么做 我没能让它保持打开状态 并且无法再等待
  • Express 中出现意外的“结束后写入”错误

    我正在尝试通过我的服务器代理来自客户端的 api 调用以获取某些第三方服务 其原因是 CORS 问题并在服务器端添加密钥 我通常通过以下方式完成它 app use someService req res gt let url https e
  • 如何在 JavaScript 中计算整数中的 1 位

    如何计算一个整数中 1 的位数 假设你有二进制数11100000 基本上开头有 3 个布尔标志 相应的十进制表示法是224 想知道如何获取该整数并以某种方式循环它以添加它开头的 1 的数量 像这样的事情 var int 224 var n
  • 我的下拉菜单的内容关闭得太快

    我正在构建一个网站 但遇到了这个问题 当我将鼠标悬停在 li 元素上并显示子菜单时 我无法单击其中的任何内容 因为它关闭得非常快 我发现了类似的问题和解决方案已经在这里尝试实现它们但没有成功 JSFiddle 链接 http jsfiddl
  • 在循环中使用glue和dplyr获取关卡名称

    我试图在循环中使用 dplyr 和胶水从表中获取级别名称 我使用循环是因为我获得大量变量来获取分组表和单个表 我在下面显示了一个示例 library dplyr library glue var c vs am for i in var b
  • 本地负载测试:无法打开负载测试结果数据库

    我正在使用 VS2012 创建一些负载测试 我可以使用 无 存储类型运行测试 但是当我将其更改为 数据库 存储类型时 我收到了可怕的错误 无法打开负载测试结果数据库 检查是否 加载由连接字符串指定的测试结果数据库 测试控制器 或本地机器 指
  • 如何在android中圆化textview一侧的角

    我想将文本视图的唯一一侧舍入 例如从左上角开始舍入 从右上角舍入一圈 我使用此代码 但这不起作用
  • 如何估计方法的执行时间?

    如果需要超过两秒才能完成并在另一个线程上重新启动它 我需要取消方法执行 那么 有没有什么方法 回调机制 HACK 我可以让方法通知我它超过了 2 秒的时间限制 在 C 中检查网络驱动器是否存在并超时 https stackoverflow
  • 具有特定 JsonConverter 的 MVC3 控制器

    这是设置 我有一些 MVC 控制器 旨在由 jQuery ajax 请求使用 一个正常的请求看起来有点像这样 ajax Solicitor AddSolicitorToApplication data putData type POST c
  • Groovy JSONBuilder 问题

    我正在尝试将 JsonBuilder 与 Groovy 结合使用来动态生成 JSON 我想创建一个 JSON 块 例如 type type urn value myCustomValue1 urn type urn value myCust
  • 在 Google Maps API v3 中启用新的 GL 渲染?

    最近 Google 在 GMaps 平台上推出了 Maps GL 我们有一个主要基于地图的 HTML5 应用程序 我们很乐意尝试基于 WebGL 的新地图渲染 我们已经注意到潜在的性能优势 有谁知道如何将 API v3 切换到 Maps G
  • JavaScript try-catch 忽略预期的偶然错误是不好的做法吗?

    在 JavaScript 中 使用 try catch 块并忽略错误而不是测试块中的许多属性是否为 null 是错误的吗 try if myInfo person name newInfo person name myInfo person
  • VS 2015 上的平台工具集更改

    我需要在 VS 2015 上进行一些汇编编码 为此我需要使用一个包含某些 C 函数的包含文件 该文件在 VS 2012 和 2013 上完美运行 但由于 VS 2015 上的一些库更改 据我所知 它在链接过程中出现错误 因此 建议我将平台工
  • Android 的 Html.escapeHtml 和 TextUtils.htmlEncode 之间有什么区别?我什么时候应该使用其中之一?

    Android 有两种不同的方法来转义 编码字符串中的 HTML 字符 实体 Html escapeHtml String http developer android com reference android text Html htm