java - "org.apache.commons.lang.StringEscapeUtils"和 "en dash"

标签 java unicode character-encoding html-escape-characters

我正在使用“*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 所在的位置,例如 charlength 以及 \uxxxx,嗯。 . 嗯,完全坏了。

关于java - "org.apache.commons.lang.StringEscapeUtils"和 "en dash",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017650/

相关文章:

java - 为什么在链 byte[] → String → byte[] 中使用 UTF-8 字符集时输入和输出不同?

Tomcat 7 org.apache.catalina.filters.AddDefaultCharsetFilter 不使用 UTF-8

asp.net-mvc - ModelBinding 中的字符不正确

java - 后台线程阻止 Tomcat 7 应用程序启动

java - 如何使用 HtmlUnit 搜索 YouTube

python - 检查 unicode True 或 False Python 的值

c# - 将 TM 上标添加到字符串

java - iText 直接打印

java - "if"语句的多重含义

python - 如何在字符串(python、perl)中找到表情符号、unicode 字符和表情符号的文本描述?