【问题标题】:Java unable to parse few unicode characters received from a feedJava 无法解析从提要接收到的几个 unicode 字符
【发布时间】:2012-09-14 07:14:25
【问题描述】:

我从我无法解析的一个提要提供商处获取以下带有 XML 中的 unicode 字符的字符串。我还尝试获取这些字符的十六进制代码,然后在其前面加上 \u,但这也不起作用。

String str = "????????????????</fullText" + ">";
StringBuilder strb = new StringBuilder();
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
  char c = chars[i];
  if ( c >= Character.MIN_HIGH_SURROGATE && c <= Character.MAX_HIGH_SURROGATE ) {
    char ch2 = chars[i+1];
  } else
    strb.append(c);
}
System.out.println(strb.toString());

理想情况下,这应该跳过这些字符,但它没有。我想去掉字符串中的那些字符。

有没有人遇到过类似的问题?非常感谢这方面的任何帮助。

外婆

【问题讨论】:

  • “无法解析”是什么意思?错误?例外?您的 XML 源文档是 UTF-8 吗?
  • 是的,它是 UTF-8,我能够解析这样的中文和字符,但是我得到这些带有 01F389 文字的框,这些框没有被解析并在我的应用程序上显示框。任何想法..

标签: java string unicode xml-parsing


【解决方案1】:

代码似乎只跳过了高代理代码点。使其也跳过以下低代理项的最简单更改是更改行

        char ch2 = chars[i+1]; 

        i++;

但是,以这种方式编写循环更健壮并且使代码更具可读性:

 for (int i = 0; i < chars.length; i++) {
     char c = chars[i];
     Character.UnicodeBlock block = Character.UnicodeBlock.of(c);
     if(block != Character.UnicodeBlock.HIGH_SURROGATES && 
        block != Character.UnicodeBlock.LOW_SURROGATES) {
           strb.append(c);
     }
 }

这还处理包含孤立的高或低代理项或高低代理项的格式错误的数据(这意味着即使您将有效代理项对作为可接受的字符处理,也应跳过或错误处理的数据)。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-11-26
    • 2013-01-22
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多