Frage

Einer unserer Anbieter senden manchmal XML-Feeds, die als UTF-8-kodierten Dokumente markiert sind, sondern enthält Zeichen, die nicht in der UTF-8-Zeichensatz enthalten sind. Dies bewirkt, dass der Parser eine Ausnahme werfen und der Aufbau das DOM-Objekt zu stoppen, wenn diese Zeichen angetroffen werden:

DocumentBuilder.parse(ByteArrayInputStream bais) 

wirft die folgende Ausnahme:

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

Gibt es eine Möglichkeit zu „erfassen“, um diese Probleme frühzeitig und zu vermeiden, dass die Ausnahme (das heißt zu finden und diese Zeichen aus dem Strom zu entfernen)? Was ich suche ist eine „best effort“ Art von Rückfall für falsch codierte Dokumente. Die richtige Lösung wäre natürlich, das Problem an der Quelle zu attackieren und dafür sorgen, dass nur korrekte Dokumente geliefert werden, aber was ist ein guter Ansatz, wenn das nicht möglich ist?

War es hilfreich?

Lösung

, wenn das Problem wirklich die falsche Codierung ist (im Gegensatz zu einer gemischten Codierung im Gegensatz), brauchen Sie nicht, um das Dokument neu kodieren sie zu analysieren. nur analysieren sie als Reader anstelle eines Input und der dom-Parser den Header ignorieren:

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

Andere Tipps

Sie sollten manuell einen Blick auf den ungültigen Dokumenten und sehen, was ihnen das gemeinsame Problem ist. Es ist sehr wahrscheinlich, sie in der Tat in einer anderen Kodierung (höchstwahrscheinlichen windows-1252) sind, und die beste Lösung wäre dann jedes Dokument aus dem gebrochenen System zu übernehmen und neu codiert es auf UTF-8 vor dem Parsing.

Eine andere mögliche Ursache ist gemischten Codierungen (der Inhalt einiger Elemente in einer Codierung ist und der Gehalt der anderen Elemente in einer anderen Kodierung). Das wäre schwieriger zu beheben.

Sie müssen auch eine Möglichkeit zu wissen, wenn das gebrochene System behoben wird, so können Sie Ihre Abhilfe nicht mehr verwenden.

Sie sollten ihnen sagen, Sie korrekte UTF-8 zu senden. Andernfalls, dass jede Lösung, die es an den Parser übergeben die schlechten Zeichen als gültige UTF-8 dann neu codieren sollte. Der Grund dafür ist, dass, wenn die schlechten Zeichen erhalten werden dann unterschiedliche Programme könnten keine Ausgabe unterschiedliche Weise interpretieren, die zu Sicherheitslücken führen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top