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

DocumentBuilder.parse(ByteArrayInputStream bais) 

抛出以下异常:

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

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

有帮助吗?

解决方案

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

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

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top