gpt4 book ai didi

java - 验证 "Invalid byte 1 of 1-byte UTF-8 sequence."中的 XML 文档结果

转载 作者:数据小太阳 更新时间:2023-10-29 01:58:07 24 4
gpt4 key购买 nike

我正在根据 Schematron 验证一些 XML 文件使用 Probatron4j 的样式表,它在内部使用 Saxon。大多数时候,这工作正常,但偶尔,处理会因错误而崩溃

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

我的研究表明此消息通常表示(无特定顺序)

  • 明显无效的数据(例如,试图将 ZIP 文件当作 XML 文件来读取);
  • 存在byte order marks ;
  • 存在 UTF-8 中不合法的字符;或
  • 声称是 UTF-8 编码的文件是在撒谎。

这些都不适用于我正在处理的文档。我在程序执行期间检查了字节数组形式的输入,它不包含 BOM 或任何非 ASCII 字符。

我的 30kb 文档处理了大约五分之一,然后遇到一个不起眼的英语句子(“不起眼”,我的意思是所有字节都在 32(空格)和 122(小写 z)之间;换句话说,标准键盘字符)。据称有问题的元素的字节在这篇文章的末尾。

奇怪的是,失败的文档是通过从一个更大的文档中删除一些元素而生成的,该文档被相同的代码干净利落地处理。

我知道在实现 org.xml.saxXMLReader 接口(interface)的对象的 parse(InputSource input) 方法中抛出异常。根据the Javadoc , SAXException 表示

Any SAX exception, possibly wrapping another exception.

在调试器中检查异常表明没有包装异常。

什么可能导致此错误?

编辑:

[60, 80, 97, 114, 97, 103, 114, 97, 112, 104, 62, 69, 120, 101, 99, 117, 116,
105, 118, 101, 32, 83, 117, 109, 109, 97, 114, 121, 58, 32, 70, 114, 111, 109,
32, 49, 55, 53, 52, 32, 116, 111, 32, 49, 55, 54, 51, 13, 10, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 69, 117, 114, 111, 112, 101, 32, 97, 110, 100,
32, 116, 104, 101, 32, 65, 109, 101, 114, 105, 99, 97, 115, 32, 119, 101, 114,
101, 32, 99, 97, 117, 103, 104, 116, 32, 117, 112, 32, 105, 110, 32, 97, 32, 99,
111, 110, 102, 108, 105, 99, 116, 32, 98, 101, 116, 119, 101, 101, 110, 32, 69,
110, 103, 108, 97, 110, 100, 44, 32, 117, 110, 100, 101, 114, 32, 75, 105, 110,
103, 32, 71, 101, 111, 114, 103, 101, 32, 73, 73, 44, 32, 97, 110, 100, 32, 70,
114, 97, 110, 99, 101, 44, 32, 117, 110, 100, 101, 114, 32, 75, 105, 110, 103,
32, 76, 111, 117, 105, 115, 32, 88, 86, 46, 32, 73, 110, 32, 69, 117, 114, 111,
112, 101, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 104, 105,
115, 32, 112, 101, 114, 105, 111, 100, 32, 119, 97, 115, 32, 107, 110, 111, 119,
110, 32, 97, 115, 32, 116, 104, 101, 32, 83, 101, 118, 101, 110, 32, 89, 101,
97, 114, 115, 39, 32, 87, 97, 114, 59, 32, 105, 110, 32, 78, 111, 114, 116, 104,
32, 65, 109, 101, 114, 105, 99, 97, 32, 105, 116, 32, 99, 97, 109, 101, 32, 116,
111, 32, 98, 101, 32, 99, 97, 108, 108, 101, 100, 32, 116, 104, 101, 32, 70,
114, 101, 110, 99, 104, 32, 97, 110, 100, 32, 73, 110, 100, 105, 97, 110, 32,
87, 97, 114, 46, 32, 73, 116, 32, 119, 97, 115, 32, 97, 32, 99, 111, 110, 102,
108, 105, 99, 116, 32, 111, 118, 101, 114, 13, 10, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 116, 114, 97, 100, 101, 32, 97, 110, 100, 32, 108, 97, 110,
100, 46, 60, 47, 80, 97, 114, 97, 103, 114, 97, 112, 104, 62]

109 第三次出现后抛出异常。

最佳答案

我已经解决了这个问题。尽管 Java 在内部为其 String 对象使用 UTF-8,但 String 类的 getBytes() 方法将以系统的默认编码生成字节,除非您明确指定您需要 UTF-8(或它理解的其他编码方案)。

我不完全确定这如何或为什么解决了这个问题,因为抛出异常的位置附近的字节——问题末尾的字节——本身都是有效的 UTF-8 字节,但是它似乎确实有固定的东西。

我能想到的唯一可能的原因是我之前在文件中错过了一个无效字节,它把事情搞砸了,但没有立即导致崩溃。我正在从 ByteArrayInputStream 中读取字节,因此程序可能一次从缓冲区中读取了一大块,这将 pos 标记设置为超出的位置假设的不良字符所在的位置。

关于java - 验证 "Invalid byte 1 of 1-byte UTF-8 sequence."中的 XML 文档结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com