MalformedByteSequenceException: недопустимый байт 2 из 2-байтовой последовательности UTF-8
У меня есть xml файл, который содержит арабские символы. Когда я пытаюсь разобрать файл, возникает Exception, 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.Как я могу решить проблему. Любое предложение должно быть заметным.
Ответы
Ответ 1
Я решил проблему, создав файл XML, используя формат UTF8.
OutputStreamWriter bufferedWriter = new OutputStreamWriter(filePath +
System.getProperty("file.separator") + fileName), "UTF8");
После создания файла с использованием вышеуказанного кода проблема с кодировкой будет разрешена. Спасибо за каждого, приложите усилие здесь.
Ответ 2
вы можете добавить в jvm параметр jvm -Dfile.encoding = utf-8.
Ответ 3
Все, что мы можем сказать из сообщения, состоит в том, что файл неправильно закодирован в UTF-8. Чтобы понять, почему, вам нужно будет проследить историю создания файла. Он может (или не может) быть полезным для изучения содержимого файла на двоичном уровне, чтобы узнать, что такое фактическая кодировка. Например, может быть полезно знать, находится ли весь файл в неправильном кодировании или он содержит только пару бродячих символов в неправильной кодировке.
Ответ 4
Довольно простое решение:
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/
Ответ 5
Я думаю, что ваш парсер ожидает байта, закодированного в UTF-8, и получает его в другой кодировке. Проверьте кодировку файла.
Возможным решением может быть преобразование файла в UTF-8.
Если у вас есть система unix, вы можете использовать этот инструмент
iconv -f original_charset -t utf-8 your_file > new_file
Ответ 6
это символ запуска на основе ОС. Вы должны использовать некоторый байт-просмотрщик и удалить его из своего документа.
Вы можете попытаться использовать что-то вроде unix2dos для преобразования управляющих символов.