java - JAXB错误: Invalid byte 1 of 1-byte UTF-8 sequence的解释

标签 java xml encoding utf-8 jaxb

我们正在使用 JAXB 解析 XML 文档并收到此错误:

[org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)

这到底是什么意思,我们该如何解决?

我们正在执行代码:

jaxbContext = JAXBContext.newInstance(Results.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(getSchema());
results = (Results) unmarshaller.unmarshal(new FileInputStream(inputFile));

更新

问题似乎是由于 XML 文件中的这个“有趣”字符造成的:¿

为什么会出现这样的问题??

更新 2

文件中有两个奇怪的字符。它们位于文件的中间。请注意,该文件是根据数据库中的数据创建的,而那些奇怪的字符不知何故进入了数据库。

更新 3

这是完整的 XML 片段:

<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description>

更新 4

注意没有<?xml ...?> header 。

特殊字符的十六进制是BF

最佳答案

所以,你的问题是 JAXB 处理没有 <?xml ...?> 的 XML 文件 header 为 UTF-8,当您的文件使用一些其他编码时(可能是 ISO-8859-1 或 Windows-1252,如果 0xBF 字符实际上意味着 ¿ )。

如果你可以改变文件的制作者,你可以添加<?xml ...?>具有实际编码规范的 header ,或仅使用 UTF-8 编写文件。

如果你不能改变生产者,你必须使用InputStreamReader具有显式编码规范,因为(不幸的是)JAXB 不允许更改其默认编码:

results = (Results) unmarshaller.unmarshal(
   new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); 

但是,此解决方案很脆弱 - 它在输入文件上失败 <?xml ...?>具有不同编码规范的 header 。

关于java - JAXB错误: Invalid byte 1 of 1-byte UTF-8 sequence的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3039998/

相关文章:

mysql - Rails 为我输入的 utf8 数据显示问号 (????)

python - 下载 youtube mp3 - 元数据编码问题(python、youtube-dl、ffmpeg)

java - 从内部类 : needs to be declared final error java swing 中访问局部变量

java - 是否可以使用枚举或命名常量设置 bean 参数?

xml - 解码混合对象类型的 xml 数组

python-3.x - 回溯错误 : Lookup Error: unknown encoding charmap

java - 2 个旋转器 : Populate second spinner from first spinner id selected using Retrofit

java - 包装类的 Junit 测试用例

java - 多线程: the best way when write duplicated data

php - 是否可以将元素名称映射到 php 类 (SoapClient)