转义的html不会转义(现在:未转义的html不会逃脱)

时间:2013-02-05 10:13:29

标签: java html character-encoding apache-commons

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

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

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

输出:😀

但是当我尝试使用少数几个字符来转义字符串时,它可以工作:

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

输出:㈳

有什么想法吗?当我尝试在online unescaping utility上取消这个字符串"😀"时,它可以工作,所以也许它是apache常见langs库中的一个错误?或者任何人都可以推荐另一个图书馆?

感谢。

更新

我现在能够成功地解除对String的影响。现在的问题是当我试图逃脱那个unescape的结果时,它不会带回字符串(?)。

5 个答案:

答案 0 :(得分:4)

unescapeHtml()保持😀不受影响,因为 - 正如the documentation所说 - 它只会取消HTML 4.0实体,限制为65,536个字符。不幸的是,128,512远远超出了这个限制。

您是否尝试过使用unescapeXml()

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

答案 1 :(得分:3)

这是一个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标量值的十进制值。您也可以使用十六进制表示& #xhhhh ;,其中hhhh是等效于十进制值的十六进制值。  this

的好网站

添加了一些SoP来帮助您更好地理解这个unicode。

enter image description here

答案 2 :(得分:2)

嗯 - 解决方案非常简单: 请改用org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4! (除非你使用Java< 1.5,你可能不会这样做)

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

答案 3 :(得分:1)

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

doc of the function只说

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

答案 4 :(得分:0)

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

  

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