Java: Wie ermittelt man die korrekte Zeichensatzkodierung eines Streams?
Mit Verweis auf folgenden thread:
Java-App : Unable to read iso-8859-1 kodierte Datei korrekt
Was ist der beste Weg, um programmgesteuert bestimmen Sie den richtigen Zeichensatz ein inputstream/Datei ?
Ich habe versucht mit der folgenden:
File in = new File(args[0]);
InputStreamReader r = new InputStreamReader(new FileInputStream(in));
System.out.println(r.getEncoding());
Aber auf eine Datei, die ich weiß, die codiert werden mit ISO8859_1 die oben genannten ASCII-code ergibt, was nicht richtig ist, und nicht erlauben, mich korrekt zu Rendern den Inhalt der Datei zurück zur Konsole.
InformationsquelleAutor der Frage Joel | 2009-01-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe diese Bibliothek, ähnlich jchardet für die Erkennung der Codierung in Java:
http://code.google.com/p/juniversalchardet/
InformationsquelleAutor der Antwort Luciano Fiandesio
Können Sie nicht bestimmen, die Kodierung einer beliebigen byte-stream. Dies liegt in der Natur der Kodierungen. Eine Codierung bedeutet, dass eine Zuordnung zwischen einem byte mit dem Wert und seiner Repräsentation. So ist jede Codierung "könnte" das richtige.
Den getEncoding() Methode zurück, die Codierung, die eingerichtet wurde (Lesen Sie die JavaDoc) für den stream. Wird es nicht erraten, wird die Kodierung für Sie.
Einige streams wird Ihnen sagen, welche Codierung verwendet wurde, um Sie zu erstellen: XML, HTML. Aber nicht ein beliebiger byte-stream.
Sowieso, Sie könnten versuchen, zu erraten, die eine Kodierung auf Ihre eigenen, wenn Sie zu haben. Jede Sprache hat eine gemeinsame Frequenz für jeden char. In Englisch ist der char e erscheint sehr oft, aber ê erscheint sehr, sehr selten. In einer ISO-8859-1 Strom gibt es in der Regel keine 0x00 chars. Aber ein UTF-16-stream hat eine Menge von Ihnen.
Oder: Sie Fragen konnte der Benutzer. Ich habe schon gesehen, Anwendungen, die Sie präsentieren einen Ausschnitt aus der Datei in verschiedenen Codierungen und Sie bitten, wählen Sie das "richtige".
InformationsquelleAutor der Antwort Eduard Wirch
check this out:
http://site.icu-project.org/ (icu4j)
Sie haben Bibliotheken, die für die Erkennung von charset von IOStream
könnte einfach sein wie dieses:
InformationsquelleAutor der Antwort user345883
Hier sind meine Favoriten:
TikaEncodingDetector
Abhängigkeit:
Beispiel:
GuessEncoding
Abhängigkeit:
Beispiel:
InformationsquelleAutor der Antwort Benny Neugebauer
Kann man sicherlich überprüfen die Datei für einen bestimmten Zeichensatz durch Dekodierung es mit einem
CharsetDecoder
und Ausschau nach "malformed input" oder "unmappable-Zeichen" - Fehler. Natürlich ist dies nur sagt Ihnen, wenn ein Zeichensatz ist falsch; es muss Ihnen nicht sagen, ob es richtig ist. Dazu braucht man eine Vergleichsbasis zur Bewertung der decodierten Resultate, z.B. wissen Sie vorher, ob die Zeichen sind beschränkt auf eine bestimmte Teilmenge, oder ob der text hält sich an einige strikte format? Die Quintessenz ist, dass die charset-Erkennung ist Spekulation ohne jegliche Garantien.InformationsquelleAutor der Antwort Zach Scrivena
Libs oben sind einfache Stückliste Detektoren, die natürlich nur funktioniert, wenn eine BOM am Anfang der Datei. Werfen Sie einen Blick auf http://jchardet.sourceforge.net/die scannt den text
InformationsquelleAutor der Antwort Lorrat
Fand ich ein nettes Drittanbieter-Bibliothek, die erkennen kann, die tatsächliche Codierung:
http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding
Ich habe nicht testen Sie es ausgiebig, aber es scheint zu funktionieren.
InformationsquelleAutor der Antwort falcon
Wenn Sie ICU4J (http://icu-project.org/apiref/icu4j/)
Hier ist mein code:
Denken Sie daran, dass alle versuchen Sie zu fangen müssen.
Ich hoffe, das funktioniert für Sie.
InformationsquelleAutor der Antwort ssamuel68
Wenn Sie nicht wissen, die Verschlüsselung Ihrer Daten, ist es nicht so einfach zu bestimmen, aber Sie könnten versuchen, eine Bibliothek zu erraten. Auch gibt es eine ähnliche Frage.
InformationsquelleAutor der Antwort Fabian Steeg
Die Bibliothek zu nutzen?
Als des Schreibens dieses Artikels, sind Sie drei Bibliotheken, die sich ergeben:
Ich weiß nicht Apache Any23weil es verwendet ICU4j 3.4 unter der Haube.
Wie zu sagen, was man erkannt hat, das Recht charset (oder so nah wie möglich)?
Es ist unmöglich, Sie zu zertifizieren, die charset-erkannt, durch die jeweils über Bibliotheken. Es ist jedoch möglich, um Sie zu bitten, in der Reihe und die Punktzahl, die der zurückgegebene Antwort.
Wie die Punktzahl, die der zurückgegebene Antwort?
Jede Reaktion zugeordnet werden können, einen Punkt. Je mehr Punkte eine Antwort haben, die mehr Vertrauen die erkannten Zeichensatz hat. Dies ist eine einfache scoring-Methode. Können Sie aufwändige andere.
Gibt es eine Beispiel-code?
Hier ist die komplette snippet Umsetzung der Strategie beschrieben, in den vorhergehenden Zeilen.
Verbesserungen:
Die
guessEncoding
Methode liest den inputstream ganz. Für große inputstreams dies kann ein Problem sein. Alle diese Bibliotheken Lesen würde das ganze inputstream. Dies würde bedeuten einen großen Zeitaufwand für die Erkennung von charset.Es ist möglich, begrenzen Sie die anfängliche laden der Daten ein paar bytes und führen Sie die charset-Erkennung auf die paar bytes.
InformationsquelleAutor der Antwort Stephan
Für ISO8859_1-Dateien, gibt es nicht eine einfache Möglichkeit zur Unterscheidung von ASCII. Für Unicode-Dateien, allerdings kann man in der Regel erkennen dies anhand der ersten paar bytes der Datei.
UTF-8 und UTF-16-Dateien enthalten eine Byte Order Mark (BOM) am Anfang der Datei. Die Stückliste ist ein zero-width non-breaking space.
Leider historische Gründe, Java nicht erkannt wird, diese automatisch. Programme wie Editor, überprüfen Sie die Stückliste und die Verwendung der entsprechenden Kodierung. Mit unix oder Cygwin, können Sie die Stückliste mit dem Datei-Befehl. Zum Beispiel:
Für Java, ich schlage vor, Sie Auschecken dieser code, der erkennt die gängigen Formate, und wählen Sie die korrekte Codierung: Wie eine Datei Lesen und automatisch die richtige Kodierung angeben
InformationsquelleAutor der Antwort brianegge
Soweit ich weiß, gibt es keine Allgemeine Bibliothek, die in diesem Zusammenhang geeignet zu sein, für alle Arten von Problemen. Also, für jedes problem sollten Sie testen, die vorhandenen Bibliotheken und wählen Sie den besten eines, welches Ihr problem der Einschränkungen, oft aber keiner von Ihnen geeignet ist. In diesen Fällen schreiben Sie Ihre eigene Codierung Detektor! Wie ich schon schrieb ...
Habe ich schon schrieb, eine meta-java-tool für die Erkennung von charset Kodierung von HTML-Web-Seiten, die mithilfe von IBM ICU4j und Mozilla JCharDet als die eingebauten Komponenten. Hier finden Sie mein tool bitte Lesen Sie die README-Sektion, bevor irgendetwas anderes. Außerdem finden Sie einige grundlegende Konzepte dieses problem in meinem Papier und seine Referenzen.
Balg ich einige hilfreiche Kommentare, die ich erlebt habe in meiner Arbeit:
InformationsquelleAutor der Antwort faghani
Alternative zu TikaEncodingDetector ist die Verwendung Tika AutoDetectReader.
InformationsquelleAutor der Antwort Nolf
Können Sie dann den entsprechenden char-set in den Konstruktor:
InformationsquelleAutor der Antwort Kevin