我正在使用“*org.apache.commons.lang.StringEscapeUtils.unescapeHtml(myHtmlString)”将 Html 实体转义符转换为包含与转义符相对应的实际 Unicode 字符的字符串。但是它不能正确解析“em dash”和“en dash”符号。 StringEscapeUtils 将“–”替换为“\u0096”,而正确的错位是“\u2013”。正如我所读,“\u0096”相当于“–”的 cp1252。那么我怎样才能让它以正确的方式工作呢?我知道我可以手动替换它,但我想知道我是否可以使用 StringEscapeUtils 或任何其他实用程序来完成它。
最佳答案
And as I have read "\u0096" is cp1252 equivalent for "–".
我不这么认为。 Unicode中的0x0096是C1控制码:
http://en.wikipedia.org/wiki/C0_and_C1_control_codes
并且不太可能替代“-”(如您所写)。
好吧,如果 StringEscapeUtils 真的搞砸了(破折号确实应该是\u2013),如果它是唯一的转义符,它就是搞砸了,如果没有理由在你的字符串中有任何其他 0x0096 ,然后 replaceAll after 调用 StringEscapeUtils 应该可以工作。
以下是您期望的替换:
System.out.println("Broken\u0096stuff".replaceAll("\u0096", "\u2013"));
但是,您应该首先确保 StringEscapeUtils 真的把事情搞砸了,并且真的,真的,理解为什么/如何在 Java 字符串中得到 0x0096。
然后,也许应该向您指出,遗憾的是 Java 的 Unicode 支持是一个主要的 SNAFU,因为 Java 是在 Unicode 3.1 出现之前构思出来的。
因此,为 char 原语使用 16 位似乎是一个聪明的想法,使用 4 位十六进制数字 '\uxxxx' 转义序列似乎是一个聪明的想法,它似乎是一个聪明的想法来表示String 的 length() 方法等中 char[] 的长度
这些实际上都是非常非常愚蠢的想法,导致了主要的 Java SNAFU 之一,其中 char 原语实际上不能再保存 Unicode 字符,而 String 的长度方法实际上不 返回字符串的实际长度。
我喜欢以下内容:
final char brokenCharCannotRepresentUnicode31Codepoints = '\uFFFF'; // How do I store a Unicode 3.1 codepoint here!?
为什么要这样咆哮?好吧,因为我不知道 String 的 replaceAll 中的正则表达式替换是如何实现的,但我真的不会感到惊讶,如果有的话(即 em> 某些代码点)字符串的 replaceAll 所在的位置,例如 char 和 length 以及 \uxxxx,嗯。 . 嗯,完全坏了。
关于java - "org.apache.commons.lang.StringEscapeUtils"和 "en dash",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017650/