4

我们的供应商之一有时会发送标记为 UTF-8 编码文档但包含未包含在 UTF-8 字符集中的字符的 XML 提要。这会导致解析器在遇到这些字符时抛出异常并停止构建 DOM 对象:

DocumentBuilder.parse(ByteArrayInputStream bais) 

抛出以下异常:

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

有没有办法尽早“捕获”这些问题并避免异常(即从流中查找和删除这些字符)?我正在寻找的是错误编码文档的“尽力而为”类型的后备。正确的解决方案显然是从源头上解决问题并确保只交付正确的文档,但是当不可能时,有什么好的方法呢?

4

3 回答 3

4

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

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));
于 2008-10-19T23:31:55.663 回答
2

您应该手动查看无效文档,看看它们的常见问题是什么。很可能它们实际上是另一种编码(很可能是 windows-1252),然后最好的解决方案是从损坏的系统中获取每个文档并在解析之前将其重新编码为 UTF-8。

另一个可能的原因是混合编码(某些元素的内容在一种编码中,而其他元素的内容在另一种编码中)。那将更难解决。

您还需要一种方法来了解损坏的系统何时得到修复,以便您可以停止使用您的解决方法。

于 2008-10-19T20:49:19.657 回答
0

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

于 2008-10-20T01:23:04.207 回答