首页 文章

修复XML文件中的错误编码

提问于
浏览
4

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

DocumentBuilder.parse(ByteArrayInputStream bais)

抛出以下异常:

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

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

3 回答

  • 4

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

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

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

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

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

  • 0

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

相关问题