所以我目前正在使用commons lang apache库。
当我尝试取消此字符串时:😀
这将返回相同的字符串:😀
String characters = "😀"
StringEscapeUtils.unescapeHtml(characters);
输出:😀
但是当我尝试使用少数几个字符来转义字符串时,它可以工作:
String characters = "㈳"
StringEscapeUtils.unescapeHtml(characters);
输出:㈳
有什么想法吗?当我尝试在online unescaping utility上取消这个字符串"😀"
时,它可以工作,所以也许它是apache常见langs库中的一个错误?或者任何人都可以推荐另一个图书馆?
感谢。
更新
我现在能够成功地解除对String的影响。现在的问题是当我试图逃脱那个unescape的结果时,它不会带回字符串(?)。
答案 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。
答案 2 :(得分:2)
嗯 - 解决方案非常简单: 请改用org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4! (除非你使用Java< 1.5,你可能不会这样做)
String characters = "😀";
StringEscapeUtils.unescapeHtml4(characters);
答案 3 :(得分:1)
答案 4 :(得分:0)
如果这是一个特定于HTML的问题,那么您可以将JavaScript用于此目的。 你可以做到
escape("😀") which gives you %26%23128512%3B
unescape("%26%23128512%3B") which gives you back 😀