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 的 length 方法实际上 不是 返回一个字符串的实际长度。
我喜欢以下内容:
final char brokenCharCannotRepresentUnicode31Codepoints = '\uFFFF'; // How do I store a Unicode 3.1 codepoint here!?
为什么要吐槽?好吧,因为我不知道 String 的 replaceAll 中的正则表达式替换是如何实现的,但我 真的 如果有案例我不会感到惊讶(ie em> 某些代码点),其中 String 的 replaceAll 像 char 和 length 和 \uxxxx 一样。 . 嗯,完全坏了。