java – 验证XML文档导致“1字节UTF-8序列的无效字节1”.

前端之家收集整理的这篇文章主要介绍了java – 验证XML文档导致“1字节UTF-8序列的无效字节1”.前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用 Probatron4j在内部使用Saxon来验证 Schematron样式表中的一些XML文件.大多数情况下,这工作正常,但偶尔,处理崩溃与错误

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接口的对象的parse(InputSource input)方法中抛出的.根据the Javadoc,SAXException表示

Any SAX exception,possibly wrapping another exception.

检查调试器中的异常表明没有包装异常.

可能导致此错误的原因是什么?

编辑:

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

在第三次出现109之后抛出异常.

解决方法

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

我不完全确定这是如何或为什么解决这个问题,因为抛出异常的地点附近的字节 – 问题末尾的字节 – 本身都是有效的UTF-8字节,但看起来确实如此有固定的东西.

我可以想到的唯一可能的原因是我错过了文件中较早的无效字节,这使得事情搞砸了但并没有导致立即崩溃.我正在从ByteArrayInputStream中读取字节,因此程序可能会同时从缓冲区中读取一个大块,这会将pos标记设置为超出假设的坏字符所在位置的位置.

猜你在找的Java相关文章