Domanda

A volte uno dei nostri provider sta inviando feed XML che sono etichettati come documenti codificati UTF-8 ma include caratteri che non sono inclusi nel set di caratteri UTF-8. In questo modo il parser genera un'eccezione e interrompe la creazione dell'oggetto DOM quando vengono rilevati questi caratteri:

DocumentBuilder.parse(ByteArrayInputStream bais) 

genera la seguente eccezione:

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

C'è un modo per " catturare " questi problemi in anticipo ed evitare l'eccezione (ovvero trovare e rimuovere quei caratteri dallo stream)? Quello che sto cercando è il "miglior sforzo" tipo di fallback per documenti codificati erroneamente. La soluzione corretta sarebbe ovviamente attaccare il problema alla fonte e assicurarsi che vengano consegnati solo documenti corretti, ma qual è un buon approccio quando ciò non è possibile?

È stato utile?

Soluzione

se il problema è davvero la codifica errata (al contrario di una codifica mista), non è necessario ricodificare il documento per analizzarlo. basta analizzarlo come Reader anziché come InputStream e il parser dom ignorerà l'intestazione:

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

Altri suggerimenti

Dovresti dare un'occhiata manualmente ai documenti non validi e vedere qual è il problema comune per loro. È abbastanza probabile che si trovino effettivamente in un'altra codifica (molto probabilmente windows-1252), e la soluzione migliore sarebbe quella di prendere tutti i documenti dal sistema rotto e ricodificarli in UTF-8 prima di analizzare.

Un'altra possibile causa sono le codifiche miste (il contenuto di alcuni elementi è in una codifica e il contenuto di altri elementi è in un'altra codifica). Sarebbe più difficile da risolvere.

Avresti anche bisogno di un modo per sapere quando il sistema guasto viene riparato in modo da poter smettere di usare la soluzione alternativa.

Dovresti dire loro di inviarti l'UTF-8 corretto. In caso contrario, qualsiasi soluzione dovrebbe ricodificare i caratteri errati come UTF-8 valido, quindi passarli al parser. La ragione di ciò è che se i caratteri cattivi vengono preservati, programmi diversi potrebbero interpretare qualsiasi output in modi diversi, il che può portare a falle nella sicurezza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top