【问题标题】:escaped html won't unescaped (now: unescaped html won't escape back)转义的 html 不会转义(现在:未转义的 html 不会转义)
【发布时间】:2013-01-20 05:31:33
【问题描述】:

所以我目前正在使用 commons lang apache 库。

当我尝试取消转义此字符串时:😀 这将返回相同的字符串:😀

String characters = "😀"
StringEscapeUtils.unescapeHtml(characters);

输出:😀

但是当我尝试用较少的字符对字符串进行转义时,它可以工作:

String characters = "㈳"
StringEscapeUtils.unescapeHtml(characters);

输出:㈳

有什么想法吗?当我尝试在online unescaping utility 上取消转义此字符串"😀" 时,它可以工作,所以这可能是apache 通用语言库中的一个错误?或者谁能​​推荐另一个图书馆?

谢谢。

更新:

我现在能够成功地取消转义字符串。现在的问题是,当我试图逃避该 unescape 的结果时,它不会带回字符串 (????)。

【问题讨论】:

  • 您使用的是哪个版本的 commons lang?
  • unescapeHTML 是根据 HTML4.0 (1998)... 补充字符 (>0xFFFF) 最初是在 Unicode 3.1 (2001) 中添加的。只需找到另一个不那么古老的图书馆。
  • @orique,2.3.0.v201005080501。
  • @mai 是的,使用 StringEscapeUtils.unescapeHtml4 from commons lang3
  • @mai 不是真的,使用 lang3 有什么问题?

标签: java html character-encoding apache-commons


【解决方案1】:

unescapeHtml() 保持 😀 不变,因为 - 正如 the documentation 所说 - 它只对 HTML 4.0 实体进行转义,限制为 65,536 个字符。不幸的是,128,512 远远超出了这个限制。

您是否尝试过使用unescapeXml()

XML 最多支持 1,114,111 (10FFFFh) 个字符实体 (link)。

【讨论】:

  • 它仍然给我 😀当我使用 unescapeXml()
  • 哦,对不起。由于误读,我没有注意到 unescapeXml() 并没有真正取消转义属于 XML 1.0 标准的 all 实体。它只转换五个基本实体:gt、lt、quot、amp、apos。
【解决方案2】:

这是一个 unicode 字符,其索引为 U+1F600 (128512) - GRINNING FACE

详情请参考URL

您提到的字符串是 U+1F600 的 HTML Escape,如果您使用 Apache commons lang 取消转义,它将为您绘制屏幕截图中提供的所需笑脸

从 U+0000 到 U+FFFF 的字符集有时称为基本多语言平面 (BMP)。码位大于 U+FFFF 的字符称为补充字符。 Java 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示。在此表示中,补充字符表示为一对 char 值,第一个来自高代理范围 (\uD800-\uDBFF),第二个来自低代理范围 (\uDC00-\uDFFF)。

关于您的更新,它没有转换回?

您还可以使用 dddd; 形式的数字字符引用来表示字符,其中 dddd 是表示字符的 Unicode 标量值的十进制值。您也可以使用十六进制表示 hhhh;,其中 hhhh 是与十进制值等效的十六进制值。 this 的好网站

添加了一些 SoP 以帮助您更好地理解此 unicode。

【讨论】:

  • 是的,它会返回一个笑脸,因为我得到了“😀”来自表情符号列表。我现在唯一的问题是,当我现在试图逃脱那个笑脸时,它不会给我回“😀” (我用 StringEscapeUtils.unescapeHtml4() 试过这个。我会用 translate() 试试这个)
  • StringEscapeUtils.ESCAPE_HTML4.translate(smiley) 不会把“😀”还给我
  • 已在修改问题后更新了答案:),请参阅链接以了解从 unicode 为代理项计算 HTML 实体的逻辑。
  • 请参考ibm.com/developerworks/library/j-unicode了解。这会有所帮助。
  • 将检查,一旦确认,我将再次开始赏金(因为它已经过期)并将您的答案标记为接受的答案。谢谢
【解决方案3】:

嗯 - 解决方案很简单: 请改用org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4! (除非您使用的是 Java

String characters = "😀";
StringEscapeUtils.unescapeHtml4(characters);

【讨论】:

  • 但是使用 StringEscapeUtils.unescapeHtml4(unescapedResult) 不会让我回到“😀”
  • 你肯定是指escapeHtml 的另一个方向?
【解决方案4】:

我认为问题在于没有 unicode 字符 "😀" 所以该方法只返回这个字符串。

doc of the function 只说

返回:一个新的非转义字符串,如果为空字符串输入则为空

【讨论】:

    【解决方案5】:

    如果这是一个特定于 HTML 的问题,那么您可以为此目的使用 JavaScript。 你可以这样做

        escape("😀") which gives you %26%23128512%3B
        unescape("%26%23128512%3B") which gives you back 😀
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2011-07-27
      相关资源
      最近更新 更多