“ org.apache.commons.lang.StringEscapeUtils”的和“冲刺”
我正在使用“* org.apache.commons.lang.StringEscapeUtils.unescapeHtml(myHtmlString)”将Html实体转义符转换为包含与转义对应的实际Unicode字符的字符串。但是它没有正确解析“em dash”和“en dash”符号。 StringEscapeUtils将“ - ”替换为“ u0096”,而正确的错位是“ u2013”。正如我所读到的“ u0096”是cp1252相当于“ - ”。那么我怎样才能让它以正确的方式运作呢?我知道我可以手动替换它,但我想知道我是否可以使用StringEscapeUtils或任何其他工具来实现。
没有找到相关结果
已邀请:
2 个回复
勺的驴吓识
我不这么认为。 Unicode中的0x0096是C1控制代码: http://en.wikipedia.org/wiki/C0_and_C1_control_codes 并且不太可能是“ - ”的替代品(正如你所写)。 好吧,如果StringEscapeUtils真的搞砸了这一点(确实应该是 u2013)并且如果它是唯一的逃脱它是搞乱的,如果没有理由在你的String中有任何其他0x0096,那么在调用StringEscapeUtils之后的replaceAll应该工作。 以下是您期望的替换:
但是,您应首先确保StringEscapeUtils真的搞砸了,并且真的,真的,理解为什么/如何在Java String中获得0x0096。 然后,也应该向你指出,遗憾的是Java的Unicode支持是一个主要的SNAFU,因为Java是在Unicode 3.1出现之前构思的。 因此,对于char原语使用16位似乎是一个明智的想法,使用4-hexdigits' uxxxx'转义序列似乎是一个明智的想法,在String的长度中表示char []的长度似乎是一个明智的想法。 ()方法等 这些实际上都是非常非常愚蠢的想法导致其中一个主要的Java SNAFU,其中char原语实际上不能再保存Unicode字符,并且String的长度方法实际上不返回String的实际长度。 我喜欢以下内容:
为什么这个咆哮?好吧,因为我不知道String的replaceAll中的regexp替换是如何实现的,但是如果有某些情况(即某些代码点),其中String的replaceAll就像char一样长度并且像 uxxxx一样,我真的不会感到惊讶嗯,完全坏了。
薄扩络拜
电话中。 相反,我怀疑这个角色在通话前已经变成了
。更具体地说,我怀疑在将HTML作为字符读取时,您的代码使用了错误的字符集。 正如你所说,en-dash是cp1252中的代码点
。因此,将un-dashed错误翻译成unicode代码点
的一种方法是从使用cp1252编码的字节流开始,并使用
对其进行读取/解码。