Java 格式错误的字节序列异常:2字节UTF-8序列的字节2无效
我有一个包含阿拉伯语字符的xml文件。当我试图解析文件时,会出现异常,MalformedByteSequenceException:2字节UTF-8序列的无效字节2。我使用POI DOM解析文档 日志是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
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编码标记