web-dev-qa-db-fra.com

MalformedByteSequenceException: octet 2 invalide de la séquence UTF-8 de 2 octets

J'ai un fichier xml qui contient des caractères arabes. Lorsque j'essaie d'analyser un fichier, il se produit l'exception, MalformedByteSequenceException: octet invalide 2 de la séquence UTF-8 de 2 octets. J'utilise POI DOM pour analyser le document.

Le journal est,

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)

L'exception ne survient que dans Windows Machine, pas dans Linux Machine.Comment puis-je résoudre le problème.Toute suggestion doit être appréciable.

J'ai résolu le problème en créant le fichier XML au format UTF8.

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

Après avoir créé le fichier en utilisant le code ci-dessus, le problème d'encodage est résolu.Merci pour tout le monde, mettez l'effort ici.

vous pouvez ajouter un paramètre jvm -Dfile.encoding = utf-8 à votre jvm.

9
Hsin

Tout ce que nous pouvons dire du message est que le fichier n'est pas correctement encodé en UTF-8. Pour comprendre pourquoi, vous devrez retracer l'historique de la création du fichier. Il peut (ou non) être utile d'étudier le contenu du fichier au niveau binaire pour voir quel est l'encodage réel. Par exemple, il peut être utile de savoir si l'intégralité du fichier est dans le mauvais encodage, ou s'il contient simplement quelques caractères parasites dans le mauvais encodage.

3
Michael Kay

Solution assez simple:

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

Réf: http://www.mkyong.com/Java/sax-error-malformedbytesequenceexception-invalid-byte-1-of-1-byte-utf-8-sequence/

2
Raaam

Je pense que votre analyseur attend un octet encodé en UTF-8 et le reçoit dans un encodage différent. Vérifiez l'encodage du fichier.

Une solution possible peut être la conversion du fichier en UTF-8.

Si vous avez un système Unix, vous pouvez utiliser cet outil

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

il s'agit d'un caractère de document de démarrage basé sur le système d'exploitation. Vous devez utiliser une visionneuse d'octets et la supprimer de votre document. Vous pouvez essayer d'utiliser quelque chose comme nix2dos pour convertir les caractères de contrôle.

0
Alex Stybaev