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
因此,您的问题是,<?xml ...?>当您的文件使用其他编码(可能是 ISO-8859-1 或 Windows-1252,如果0xBF字符实际上意味着\xc2\xbf)时,JAXB 将没有标头的 XML 文件视为 UTF-8。
如果您可以更改文件的生产者,您可以添加<?xml ...?>具有实际编码规范的标头,或者仅使用 UTF-8 写入文件。
如果您无法更改生产者,则必须使用InputStreamReader显式编码规范,因为(不幸的是)JAXB 不允许更改其默认编码:
results = (Results) unmarshaller.unmarshal(\n new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); \nRun Code Online (Sandbox Code Playgroud)\n\n然而,这个解决方案很脆弱——它在<?xml ...?>具有不同编码规范的标头的输入文件上失败。
| 归档时间: |
|
| 查看次数: |
18031 次 |
| 最近记录: |