我正在使用“ * org.apache.commons.lang.StringEscapeUtils.unescapeHtml(myHtmlString)”将HTML实体转义转换为包含与转义相对应的实际Unicode字符的字符串。但是,它不能正确解析“破折号”和“破折号”符号。当正确的错位是“ \ u2013”​​时,StringEscapeUtils用“ \ u0096”替换“ –”。如我所读,“ \ 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的原因,那么在调用StringEscapeUtils之后的replaceAll应该可以工作。

以下是您期望的替换:

System.out.println("Broken\u0096stuff".replaceAll("\u0096", "\u2013"));


但是,您首先应该确保StringEscapeUtils确实弄乱了事情,并且确实要理解为什么/如何在Java String中获得该0x0096。

然后,也许还应该向您指出,可悲的是Java的Unicode支持是主要的SNAFU,因为Java是在Unicode 3.1诞生之前就诞生的。

因此,对char基元使用16位似乎是一个聪明的主意,对4个十六进制数字'\ uxxxx'进行转义似乎是一个聪明的主意,用String的长度表示char []的长度似乎是一个好主意。 ()方法等

这些实际上都是非常愚蠢的主意,导致出现了一个主要的Java SNAFU,其中char原语实际上不再能够容纳Unicode char,并且String的length方法实际上并未返回String的实际长度。

我喜欢以下内容:

final char brokenCharCannotRepresentUnicode31Codepoints = '\uFFFF'; // How do I store a Unicode 3.1 codepoint here!?


为什么这个rant怒?好吧,因为我不知道String的replaceAll中的正则表达式替换是如何实现的,但是如果有情况(例如某些代码点)使用String的replaceAll,例如char和like length和\ uxxxx,我真的不会感到惊讶..嗯,完全坏了。

09-05 09:45