JAXB错误的说明:1字节UTF-8序列的字节1无效

Mar*_*eon 5 java xml encoding jaxb utf-8

我们正在使用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)
Run Code Online (Sandbox Code Playgroud)

这究竟是什么意思,我们如何解决这个问题?

我们正在执行以下代码:

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

更新

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

为什么会导致这样的问题?

更新2

文件中有两个奇怪的字符.它们位于文件的中间.请注意,该文件是基于数据库中的数据创建的,并且这些奇怪的字符以某种方式进入数据库.

更新3

这是完整的XML代码段:

<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description>
Run Code Online (Sandbox Code Playgroud)

更新4

请注意,没有<?xml ...?> 标题.

特殊字符的HEX是BF

axt*_*avt 3

因此,您的问题是,<?xml ...?>当您的文件使用其他编码(可能是 ISO-8859-1 或 Windows-1252,如果0xBF字符实际上意味着\xc2\xbf)时,JAXB 将没有标头的 XML 文件视为 UTF-8。

\n\n

如果您可以更改文件的生产者,您可以添加<?xml ...?>具有实际编码规范的标头,或者仅使用 UTF-8 写入文件。

\n\n

如果您无法更改生产者,则必须使用InputStreamReader显式编码规范,因为(不幸的是)JAXB 不允许更改其默认编码:

\n\n
results = (Results) unmarshaller.unmarshal(\n   new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); \n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,这个解决方案很脆弱——它在<?xml ...?>具有不同编码规范的标头的输入文件上失败。

\n