【问题标题】:Repairing wrong encoding in XML files修复 XML 文件中的错误编码
【发布时间】:2010-09-18 00:42:27
【问题描述】:

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

DocumentBuilder.parse(ByteArrayInputStream bais) 

抛出以下异常:

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

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

【问题讨论】:

    标签: java xml parsing encoding xerces


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的提示。它避免了异常,不幸的是,它对我没有太大帮助,因为似乎非法字符在我提取(和需要)的标识符字符串中,而这些字符现在得到了错误的编码。我想我只需要等待内容提供商修复他们的错误。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我怀疑这是混合编码(或只是几个“流氓”字符)的情况,因为来自同一来源的其他数据工作正常。它包含瑞典的位置名称,因此我怀疑它们的某些字符编码不佳。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多