2016-04-04 7 views
2

Ich verwende Jsoup, um HTML-Dateien zu analysieren, die unbekannte Zeichenkodierungen haben. Ich rufe Jsoup.parse mit einem Null-Zeichensatz und letting Jsoup Autodetect. Einige der Dateien haben meta Tags und Jsoup nimmt das gut auf.Kann ich jsoup eine Fallback-Zeichencodierung geben, die verwendet wird, wenn Meta-Tags nicht gefunden werden?

Einige meiner Dateien haben jedoch keine meta Tags und verwenden verschiedene Kodierungen, die nicht UTF-8 sind. Jsoup fällt für diese Fälle auf UTF-8 zurück, was zu einigen gebrochenen Zeichen führt. Ich habe festgestellt, dass die Bibliothek juniversalchardet diese Fälle korrekt erkennen kann. Zum Beispiel wurde die Codierung WINDOWS-1252 in mehreren Beispielen korrekt erkannt.


Im Idealfall möchte ich die meta-Tags verwenden, wenn sie vorhanden sind. Wenn sie dann nicht darauf zurückgreifen, was juniversalchardet meldet (nicht nur raten UTF-8).

  1. Kann ich Jsoup mit einem Fallback-Zeichensatz zur Verfügung stellen, um ihn nur in Fällen zu verwenden, in denen er kein Meta-Tag finden kann?
  2. Alternativ kann ich von Jsoup Informationen darüber erhalten, ob es die Codierung erraten musste oder nicht? Wenn es berichtet, dass es dann erraten hat, könnte ich juniversalchardet aufrufen und dann mit einer expliziten Kodierung analysieren, die an Jsoup weitergegeben wurde.

Ich habe in den Quellcode von Jsoup sah und wie von v1.8.3 scheint es, dass der Code die charset von meta Tags zu erfassen, wird in einem separaten Verfahren nicht herausgerechnet (sucht Quelle org.jsoup.helper.DataUtil Klasse). Außerdem scheinen Informationen darüber, ob es erraten wurde oder nicht, zu dem resultierenden Dokument zu führen.

Gibt es einen besseren Weg, um mein Ziel zu erreichen? Gibt es eine Bibliothek zum Erkennen von Zeichenkodierungen von Dateien, die bereits HTML-Metatags verwenden können, wenn sie existieren, die ich anstelle von jsoups automatischer Erkennung verwenden könnte?

Antwort

0

Ich entschied mich, Apache Tika zu verwenden. Es hat eine HtmlEncodingDetector Klasse, um HTML meta Tags zu finden. Wenn dies aufgrund von nicht vorhandenen Meta-Tags fehlschlägt, falle ich zu Tikas UniversalEncodingDetector zurück. (Letzteres ist ein Wrapper für juniversalchardet. Ich benutze den Wrapper statt juniversalchardet direkt zu rufen, weil es praktisch für beide Detektoren ist, die gleiche Java-Schnittstelle zu haben.)

Ich benutze effektiv Jsoups automatische Erkennung jetzt.

Die einzige Einschränkung ist, dass Tika ein ziemlich großes Projekt ist und das Hinzufügen einer großen Anzahl von irrelevanten Abhängigkeiten.

Verwandte Themen