Apache POI异常空格(已解决:\u00A0不间断空格)

3

编辑:解决方案:该问题是由于存在00a0非断空格,而不是c0a0非断空格引起的。

使用Apache POI将docx转换为纯文本后,将纯文本读入Java并尝试解析时,我遇到了以下问题。

输出:

" "
first characterequals SPACE OR TAB 
false
[B@5e481248
[B@66d3c617
ARRAYTOSTRING SPACE: [32]
ARRAYTOSTRING ?????: [-62, -96]

对于代码:

System.out.println("\t\"" + line.substring(0,1) + "\"\n\tfirst characterequals SPACE OR TAB \n\t" + (line.substring(0,1).equals(" ") 
                        || line.substring(0,1).equals("\t") ));
System.out.println(line.substring(0,1).getBytes());
System.out.println(" ".getBytes());
System.out.println("ARRAYTOSTRING SPACE: " + Arrays.toString(" ".getBytes()));
System.out.println("ARRAYTOSTRING ?????: " + Arrays.toString(line.substring(0,1).getBytes()));

String.trim() 无法去除它。
String.replaceAll("\s", "")也无法去除它。

我正在尝试解析一份庞大的材料文档,这成为了一个重大障碍。我不知道发生了什么,也不知道该如何与其交互,请问有人能解释一下这里到底出了什么问题吗?


1
你真的应该至少添加一小段你的提取代码。 - llogiq
我不确定提取代码在没有上下文的情况下是否有太多意义,它只是逐行提取,而这个调试片段则复制了循环检查,以使实际比较的内容可见。 - Captain Prinny
2个回答

3
这意味着用十六进制表示的字节为c2 a0,根据这个答案,它是一个UTF-8编码的不间断空格。请注意,这实际上并不是一个空格,\s不能匹配它。

  1. 是否有一个易于引用的源/字符集,它将显示为空格但不匹配它(或正则表达式来包括这些)?
  2. 这个字符是否有转义序列或任何简单的东西可以与之匹配?
- Captain Prinny
我使用了http://www.amp-what.com/unicode/search/space(尽管它包含很多其他结果)。逃逸序列应该是(毫不奇怪)`\u{c2a0}`。 - llogiq
再次查看amp-what页面,它列出了一些。值得注意的是\u200B,零宽度空格以及\u2002到\u200a(各种空格宽度)和\u200F(窄的不间断空格)。 - llogiq
非常感谢,这非常有帮助。 - Captain Prinny
分析是适用的,但需要进一步调查才能实施。 - Captain Prinny
显示剩余3条评论

0

这个对我有用:

 String valor = org.apache.commons.lang3.StringUtils.normalizeSpace(java.text.Normalizer.normalize(valor, java.text.Normalizer.Form.NFD));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接