Question

Un de nos fournisseurs envoie parfois des flux XML étiquetés en tant que documents codés UTF-8 mais comprenant des caractères qui ne sont pas inclus dans le jeu de caractères UTF-8. L’analyseur génère alors une exception et arrête de construire l’objet DOM lorsque ces caractères sont rencontrés:

DocumentBuilder.parse(ByteArrayInputStream bais) 

lève l'exception suivante:

org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.

Existe-t-il un moyen de " capturer " ces problèmes tôt et éviter l’exception (c’est-à-dire trouver et supprimer ces caractères du flux)? Ce que je recherche, c’est un "meilleur effort". type de secours pour les documents mal encodés. La bonne solution serait évidemment d’attaquer le problème à la source et de s’assurer que seuls les documents corrects sont livrés, mais quelle est la bonne approche lorsque ce n’est pas possible?

Était-ce utile?

La solution

Si le problème est vraiment le mauvais codage (par opposition à un codage mixte), vous n'avez pas besoin de ré-encoder le document pour l'analyser. il suffit de l’analyser comme un lecteur au lieu d’un inputStream et l’analyseur dom ignorera l’en-tête:

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));

Autres conseils

Vous devez examiner manuellement les documents non valides et voir quel est le problème qui leur est commun. Il est fort probable qu'ils se trouvent en fait dans un autre encodage (très probablement Windows-1252), et la meilleure solution serait alors de prendre tous les documents du système endommagé et de les recoder en UTF-8 avant de les analyser.

Une autre cause possible est le codage mixte (le contenu de certains éléments se trouve dans un codage et le contenu des autres éléments dans un autre). Ce serait plus difficile à résoudre.

Vous auriez également besoin d'un moyen de savoir quand le système endommagé est réparé afin de pouvoir arrêter d'utiliser votre solution de contournement.

Vous devriez leur dire de vous envoyer le fichier UTF-8 correct. À défaut, toute solution devrait recoder les caractères incorrects en UTF-8 valide, puis le transmettre à l'analyseur. La raison en est que si les caractères incorrects sont préservés, différents programmes pourraient interpréter les résultats de différentes manières, ce qui pourrait conduire à des failles de sécurité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top