2012-03-29 5 views
16

Ich habe eine XML-Datei, die arabische Zeichen enthält.Wenn ich versuche, eine Datei zu analysieren, entsteht die Ausnahme, MalformedByteSequenceException: Ungültige Byte 2 von 2-Byte UTF- 8 sequenz.I Verwenden Sie POI DOM zum Parsen des Dokuments.MalformedByteSequenceException: Ungültiges Byte 2 der 2-Byte-UTF-8-Sequenz

Das Log ist,

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) 

Die Ausnahme entstehen nur in Windows-Maschine, entstehen nicht in Linux Machine.How kann ich die issue.Any Vorschlag sollte spürbar sein lösen.

Antwort

13

Ich habe das Problem gelöst, indem Sie die XML-Datei im UTF8-Format erstellen.

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

Nachdem Sie die Datei erstellen Sie den obigen Code verwenden, die Codierung Problem ist resolved.Thanks für jeden, legen Sie die hier Mühe.

+3

Dies ist die Lösung, die für mich gearbeitet, aber ich musste eine kleine Änderung vornehmen: Output os = new Fileoutputstream (file); und OutputStreamWriter bufferedWriter = new OutputStreamWriter (os, "UTF8"); – maxivis

0

Ich denke, dass Ihr Parser erwartet ein Byte in UTF-8 codiert und empfängt es in verschiedenen Codierung. Überprüfen Sie die Codierung der Datei.

Eine mögliche Lösung möglicherweise die Datei in UTF-8 konvertieren.

Wenn Sie ein Unix-System haben, können Sie dieses Tool verwenden

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

dies OS-basierten Startdokument Charakter. Sie sollten einen Byte-Viewer verwenden und ihn aus Ihrem Dokument löschen. Sie können versuchen, etwas wie unix2dos zu verwenden, um Steuerzeichen zu konvertieren.

3

Alles, was wir aus der Nachricht erkennen können, ist, dass die Datei in UTF-8 nicht richtig codiert ist. Um herauszufinden, warum, müssen Sie den Verlauf der Erstellung der Datei verfolgen. Es kann (oder auch nicht) hilfreich sein, den Dateiinhalt auf der binären Ebene zu untersuchen, um zu sehen, was die tatsächliche Kodierung ist. Zum Beispiel kann es nützlich sein zu wissen, ob die ganze Datei in der falschen Kodierung ist, oder ob sie nur ein paar zufällige Zeichen in der falschen Kodierung enthält.

7

Sie können einen jvm-Parameter -Dfile.encoding = utf-8 zu Ihrem jvm hinzufügen.