修复XML文件中的错误编码

4

我们的某些供应商有时会发送被标记为UTF-8编码文档的XML源,但其中包含不属于UTF-8字符集的字符。当解析器遇到这些字符时,会抛出异常并停止构建DOM对象:

DocumentBuilder.parse(ByteArrayInputStream bais) 

抛出以下异常:

org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.

有没有一种方法可以尽早“捕获”这些问题并避免异常(即从流中查找并删除这些字符)?我正在寻找一种针对错误编码文档的“尽力而为”的后备方案。显然,正确的解决方案是从源头解决问题,并确保只传递正确的文档,但当这不可能时,有什么好的方法呢?
3个回答

4

如果问题确实是错误的编码(而不是混合编码),您无需重新编码文档即可解析它。只需将其作为Reader而不是InputStream解析,dom解析器将忽略头部:

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));

谢谢你的提示。它避免了异常,但不幸的是并没有帮助我太多,因为似乎非法字符在我提取(并需要)的标识符字符串内部,并且现在这些字符串得到了错误的编码。我想我只能等待内容提供者修复他们的错误。 - Burre

2
你应该手动查看无效文档,并查看它们的共同问题。很可能它们实际上是另一种编码(最可能是windows-1252),然后最好的解决方案是在解析之前将损坏系统中的每个文档重新编码为UTF-8。
另一个可能的原因是混合编码(某些元素的内容使用一种编码,而其他元素的内容使用另一种编码)。这将更难修复。
你还需要一种方法来知道何时修复了损坏的系统,以便停止使用你的解决方法。

我怀疑这是混合编码的情况(或者只是一些“流氓”字符),因为来自同一来源的其他数据都可以正常工作。它包含瑞典的地名,所以我怀疑它们有一些字符编码不正确。 - Burre

0

你应该告诉他们发送正确的UTF-8编码。如果无法做到,任何解决方案都应该将坏字符重新编码为有效的UTF-8,然后再传递给解析器。这样做的原因是,如果保留了坏字符,不同的程序可能会以不同的方式解释任何输出,这可能会导致安全漏洞。


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