15

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

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

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

输出:😀

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

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

输出:㈳

有任何想法吗?当我尝试"😀"在线取消转义实用程序上取消转义此字符串时,它可以工作,所以也许它是 apache common langs 库中的错误?或者有人可以推荐另一个图书馆吗?

谢谢。

更新:

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

4

5 回答 5

4

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

你试过使用unescapeXml()吗?

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

于 2013-02-07T18:07:47.723 回答
3

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

详情请参考网址

您提到的字符串是 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)。

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

于 2013-02-13T18:35:49.753 回答
2

好吧 - 解决方案很简单:改用org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4!(除非您使用的是 Java <1.5,否则您可能不会)

String characters = "&#128512;";
StringEscapeUtils.unescapeHtml4(characters);
于 2013-02-12T04:08:48.530 回答
1

我认为问题在于没有 unicode 字符"&#128512;" ,因此该方法仅返回此字符串。

函数的文档只说

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

于 2013-02-07T17:45:33.440 回答
0

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

    escape("&#128512;") which gives you %26%23128512%3B
    unescape("%26%23128512%3B") which gives you back &#128512;
于 2013-02-14T14:36:03.423 回答