Java 格式错误的字节序列异常:2字节UTF-8序列的字节2无效

Java 格式错误的字节序列异常:2字节UTF-8序列的字节2无效,java,xml,apache-poi,Java,Xml,Apache Poi,我有一个包含阿拉伯语字符的xml文件。当我试图解析文件时,会出现异常,MalformedByteSequenceException:2字节UTF-8序列的无效字节2。我使用POI DOM解析文档 日志是 2012-03-19 11:30:00,433 [ERROR] (com.infomindz.remitglobe.bll.remittance.BlackListBean) - Error com.sun.org.apache.xerces.internal.impl.io.Malform

我有一个包含阿拉伯语字符的xml文件。当我试图解析文件时,会出现异常,MalformedByteSequenceException:2字节UTF-8序列的无效字节2。我使用POI DOM解析文档

日志是

2012-03-19 11:30:00,433 [ERROR] (com.infomindz.remitglobe.bll.remittance.BlackListBean) - Error 

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence.

    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)

    at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)

    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)

    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(Unknown Source)

    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)

    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)

    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)

    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)

    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)

    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)

    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

    at com.infomindz.remitglobe.bll.remittance.BlackListBean.updateGeneralBlackListDetail(Unknown Source)

    at com.infomindz.remitglobe.bll.remittance.schedulers.BlackListUpdateScheduler.executeInternal(Unknown Source)

    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)

    at org.quartz.core.JobRunShell.run(JobRunShell.java:216)

    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)

此异常仅在windows计算机中出现,而在Linux计算机中不出现。我如何解决此问题。任何建议都应该是值得注意的。

我认为您的解析器希望使用UTF-8编码的字节,并以不同的编码接收它。检查文件的编码

一种可能的解决方案是将文件转换为UTF-8

如果您有unix系统,则可以使用此工具

iconv -f original_charset -t utf-8 your_file > new_file

这是基于操作系统的开始文档字符。您应该使用一些字节查看器并将其从文档中删除。
您可以尝试使用类似的方法来转换控制字符。

从消息中我们可以看出,该文件未正确编码为UTF-8。要找出原因,您需要跟踪文件创建的历史记录。在二进制级别研究文件内容以了解实际编码是什么可能(也可能没有)有帮助。例如,了解整个文件是否采用了错误的编码,或者是否只包含了几个错误编码的零散字符,可能会很有用。

我已经解决了这个问题,使用UTF8格式创建了XML文件

OutputStreamWriter bufferedWriter = new OutputStreamWriter(filePath +
                        System.getProperty("file.separator") + fileName), "UTF8");

使用上述代码创建文件后,编码问题得到解决。感谢大家的努力。您可以将jvm参数-Dfile.encoding=utf-8添加到jvm中。

非常简单的解决方案:

File file = new File("c:\\file-utf.xml");
InputStream inputStream= new FileInputStream(file);
Reader reader = new InputStreamReader(inputStream,"UTF-8");

InputSource is = new InputSource(reader);
// is.setEncoding("UTF-8"); -> This line causes error! Content is not allowed in prolog

saxParser.parse(is, handler);

Ref:

这是一个适合我的解决方案,但我必须做一点修改:OutputStream os=newfileoutputstream(file);和OutputStreamWriter bufferedWriter=新的OutputStreamWriter(os,“UTF8”);在我的例子中,没有阿拉伯字符,但我确实需要包含xml编码标记