Android 的 Html.escapeHtml 和 TextUtils.htmlEncode 有什么区别?我什么时候应该使用一个或另一个?
What's the difference between Android's Html.escapeHtml and TextUtils.htmlEncode ? When should I use one or the other?
Android 有两种不同的方式来转义/编码字符串中的 HTML 个字符/实体:
Html.escapeHtml(String)
,添加于 API 16 (Android 4.1)。文档说:
Returns an HTML escaped representation of the given plain text.
TextUtils.htmlEncode(String)
对于这个,文档说:
Html-encode the string.
阅读文档,它们似乎做的事情几乎相同,但是,在测试它们时,我得到了一些(对我来说)非常神秘的输出。
例如。输入:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
Html.escapeHtml
给出:
<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
而 TextUtils.htmlEncode
给出:
<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
所以看起来第二个转义/编码引号 ("),但第一个没有,虽然第一个编码了欧元符号,但第二个没有' t.我很困惑。
那么这两种方法有什么区别呢?每个转义/编码哪些字符?这里的 encoding 和 escaping 有什么区别?我什么时候应该使用一个或另一个(或者我应该一起使用它们?)?
你可以比较他们的来源:
下面是 Html.escapeHtml
使用的内容:
这是TextUtils.htmlEncode
:
可以看到,后者只引用了HTML中标记保留的某些字符,而前者还对非ASCII字符进行了编码,因此可以用ASCII表示。
因此,如果您的输入仅包含拉丁字符(现在通常不太可能),或者您已经在 HTML 页面中正确设置了 Unicode,并且可以使用 TextUtils.htmlEncode
。而如果您需要确保您的文本即使通过 7 位通道传输也能正常工作,请使用 Html.escapeHtml
.
至于引号字符的不同处理方式 ("
) -- 它只需要在属性值内进行转义(参见 the spec),因此如果您不将文本放在那里,你应该没问题。
因此,我个人的选择是Html.escapeHtml
,因为它看起来更通用。
Android 有两种不同的方式来转义/编码字符串中的 HTML 个字符/实体:
Html.escapeHtml(String)
,添加于 API 16 (Android 4.1)。文档说:Returns an HTML escaped representation of the given plain text.
TextUtils.htmlEncode(String)
对于这个,文档说:Html-encode the string.
阅读文档,它们似乎做的事情几乎相同,但是,在测试它们时,我得到了一些(对我来说)非常神秘的输出。
例如。输入:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
Html.escapeHtml
给出:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
而
TextUtils.htmlEncode
给出:<p>This is a quote ". This is a euro symbol: €. <b>This is some bold text</b></p>
所以看起来第二个转义/编码引号 ("),但第一个没有,虽然第一个编码了欧元符号,但第二个没有' t.我很困惑。
那么这两种方法有什么区别呢?每个转义/编码哪些字符?这里的 encoding 和 escaping 有什么区别?我什么时候应该使用一个或另一个(或者我应该一起使用它们?)?
你可以比较他们的来源:
下面是 Html.escapeHtml
使用的内容:
这是TextUtils.htmlEncode
:
可以看到,后者只引用了HTML中标记保留的某些字符,而前者还对非ASCII字符进行了编码,因此可以用ASCII表示。
因此,如果您的输入仅包含拉丁字符(现在通常不太可能),或者您已经在 HTML 页面中正确设置了 Unicode,并且可以使用 TextUtils.htmlEncode
。而如果您需要确保您的文本即使通过 7 位通道传输也能正常工作,请使用 Html.escapeHtml
.
至于引号字符的不同处理方式 ("
) -- 它只需要在属性值内进行转义(参见 the spec),因此如果您不将文本放在那里,你应该没问题。
因此,我个人的选择是Html.escapeHtml
,因为它看起来更通用。