MalformedByteSequenceException: недопустимый байт 2 2-байтовой последовательности UTF-8 - PullRequest
16 голосов
/ 29 марта 2012

У меня есть xml-файл, который содержит арабские символы. Когда я пытаюсь проанализировать файл, возникает исключение, MalformedByteSequenceException: недопустимый байт 2 из 2-байтовой последовательности UTF-8. Я использую 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 Machine, а не в Linux Machine. Как я могу решить эту проблему. Любое предложение должно быть заметно.

Ответы [ 6 ]

13 голосов
/ 03 апреля 2012

Я решил проблему, создав файл XML в формате UTF8.

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

После создания файла с использованием вышеуказанного кода проблема с кодировкой решена. Спасибо за каждое, приложите усилия здесь.

8 голосов
/ 19 июня 2015

вы можете добавить параметр jvm -Dfile.encoding = utf-8 к вашему jvm.

3 голосов
/ 29 марта 2012

Все, что мы можем сказать из сообщения, это то, что файл неправильно закодирован в UTF-8. Чтобы понять почему, вам нужно будет проследить историю создания файла. Может быть (или не может) быть полезным изучить содержимое файла на двоичном уровне, чтобы увидеть, какова действительная кодировка. Например, может быть полезно узнать, находится ли весь файл в неправильной кодировке, или он просто содержит пару случайных символов в неправильной кодировке.

2 голосов
/ 17 августа 2015

Довольно простое решение:

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);

Ссылка: http://www.mkyong.com/java/sax-error-malformedbytesequenceexception-invalid-byte-1-of-1-byte-utf-8-sequence/

0 голосов
/ 29 марта 2012

это символ начального документа ОС.Вы должны использовать некоторое средство просмотра байтов и удалить его из своего документа.Вы можете попробовать использовать что-то вроде unix2dos для преобразования управляющих символов.

0 голосов
/ 29 марта 2012

Я думаю, что ваш парсер ожидает байт, закодированный в UTF-8, и получает его в другой кодировке. Проверьте кодировку файла.

Возможным решением может быть преобразование файла в UTF-8.

Если у вас есть система Unix, вы можете использовать этот инструмент

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