2012-03-29 7 views
16

Mam plik xml, który zawiera znaki arabskie. Kiedy próbuję parsować plik, powstaje wyjątek, MalformedByteSequenceException: Niepoprawny bajt 2 2-bajtowego UTF- 8 sekwencja.I Użyj DOM POI do analizy dokumentu.MalformedByteSequenceException: Niepoprawny bajt 2 2-bajtowej sekwencji UTF-8

Log jest

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) 

Wyjątkiem powstać tylko w systemie Windows urządzenia nie pojawiają się w Linux Machine.How mogę rozwiązać sugestia issue.Any powinien być odczuwalny.

Odpowiedz

13

Rozwiązałem problem, tworząc plik XML w formacie UTF8.

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

Po utworzyć plik, używając powyższego kodu, problem kodowania jest resolved.Thanks dla każdego, włożyć wysiłek tutaj.

+3

Jest to rozwiązanie, które pracował dla mnie, ale musiałem zrobić małą zmianę: os OutputStream = new FileOutputStream (plik); i OutputStreamWriter bufferedWriter = new OutputStreamWriter (os, "UTF8"); – maxivis

0

Myślę, że twój analizator składniowy oczekuje bajtu zakodowanego w UTF-8 i odbiera go w innym kodowaniu. Sprawdź kodowanie pliku.

Możliwe rozwiązanie to konwersja pliku na UTF-8.

Jeśli masz system Unix, można użyć tego narzędzia

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

to postać dokumentu początek OS. Powinieneś użyć przeglądarki bajtów i usunąć ją z dokumentu. Możesz spróbować użyć czegoś podobnego do unix2dos, aby konwertować znaki kontrolne.

3

Wszystko, co możemy powiedzieć z komunikatu, to to, że plik nie jest poprawnie zakodowany w UTF-8. Aby dowiedzieć się, dlaczego tak się dzieje, musisz prześledzić historię utworzenia pliku. Może (lub nie musi) być pomocne w badaniu zawartości pliku na poziomie binarnym, aby zobaczyć, jakie jest rzeczywiste kodowanie. Na przykład przydatne może być ustalenie, czy cały plik zawiera błędne kodowanie, czy też zawiera tylko kilka zabłąkanych znaków w niewłaściwym kodowaniu.

7

możesz dodać parametr jvm -Dfile.encoding = utf-8 do swojego jvm.