2008-10-19 6 views
4

L'un de nos fournisseurs envoie parfois des flux XML étiquetés en tant que documents codés en UTF-8, mais inclut des caractères qui ne sont pas inclus dans le jeu de caractères UTF-8. Cela provoque l'analyseur de lancer une exception et d'arrêter la construction de l'objet DOM lorsque ces caractères sont rencontrés:Réparation d'un codage incorrect dans les fichiers XML

DocumentBuilder.parse(ByteArrayInputStream bais) 

lève l'exception suivante:

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

est-il un moyen de « capturer » ces problèmes au début et éviter l'exception (c'est-à-dire trouver et supprimer ces caractères du flux)? Ce que je cherche est un type de repli de «meilleur effort» pour les documents mal encodés. La solution correcte serait évidemment d'attaquer le problème à la source et de s'assurer que seuls les bons documents sont livrés, mais quelle est une bonne approche lorsque cela n'est pas possible?

Répondre

4

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

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

Merci pour le conseil. Il a évité l'exception, malheureusement cela ne m'a pas beaucoup aidé car il semble que les caractères illicites soient dans les chaînes d'identificateurs que j'extrais (et dont j'ai besoin), et que ceux-ci reçoivent le mauvais encodage maintenant. Je pense que je vais devoir attendre que les fournisseurs de contenu corrigent leur erreur. – Burre

2

Vous devriez regarder manuellement les documents non valides et voir quel est leur problème commun. Il est très probable qu'ils sont en fait dans un autre encodage (très probablement windows-1252), et la meilleure solution serait alors de prendre chaque document du système cassé et de le recoder en UTF-8 avant l'analyse.

Une autre cause possible est les codages mixtes (le contenu de certains éléments est codé et le contenu des autres éléments est codé de manière différente). Ce serait plus difficile à réparer.

Vous auriez également besoin d'un moyen de savoir quand le système cassé est fixé afin que vous puissiez arrêter d'utiliser votre solution de contournement.

+0

Je suppose qu'il s'agit d'un codage mixte (ou seulement de quelques caractères "voyous") car d'autres données de la même source fonctionnent correctement. Il contient des noms de lieux en Suède, donc je pense qu'ils ont des caractères mal encodés. – Burre

0

Vous devez leur dire de vous envoyer correcte UTF-8. À défaut de toute solution devrait ré-encoder les mauvais caractères comme UTF-8 valide puis le passer à l'analyseur. La raison en est que si les mauvais caractères sont conservés, différents programmes peuvent interpréter n'importe quelle sortie de différentes façons, ce qui peut entraîner des failles de sécurité.

Questions connexes