Refactoring automatische Erkennung der Dateicodierung

8

Ich muss die Kodierungsdateien überprüfen. Dieser Code funktioniert, aber es ist ein bisschen lang. Wie kann man diese Logik umgestalten? Vielleicht kann man eine andere Variante für dieses Ziel verwenden?

Code:

%Vor%

Frage:

  • Wie wird diese Programmlogik umgestaltet?
  • Welche Möglichkeiten gibt es, die Codierung zu erkennen (als UTF-16 Sequance usw.)?
nazar_art 01.03.2013, 09:38
quelle

2 Antworten

5

Der beste Weg, diesen Code zu überarbeiten, wäre, eine Bibliothek von Drittanbietern einzubringen, die Zeichenerkennung für Sie durchführt, weil sie es wahrscheinlich besser machen und Ihren Code kleiner machen würde. diese Frage für einige Alternativen

    
radai 01.03.2013, 09:45
quelle
3

Wie bereits erwähnt, können Sie die Codierung einer Datei nicht "kennen" oder "erkennen". Um eine vollständige Genauigkeit zu erreichen, müssen Sie erzählt werden , da es fast immer eine Bytefolge gibt, die in Bezug auf mehrere Zeichenkodierungen mehrdeutig ist.

In dieser SO-Frage finden Sie weitere Erläuterungen zum Erkennen von UTF-8 und ISO8859-1. Das Essenzielle Die Antwort lautet Überprüfen Sie jede Bytefolge in der Datei , um die Kompatibilität zu überprüfen mit der Codierung erwartet. Für UTF-8-Byte-Kodierungsregeln siehe Ссылка .

Insbesondere gibt es ein sehr interessantes Papier zur Erkennung von Zeichenkodierungen / -sätzen Ссылка Sie behaupten, sie hätten eine extrem hohe Genauigkeit (Vermutungen!). Der Preis ist ein sehr komplexes Erkennungssystem, komplett mit Kenntnissen über Zeichenfrequenzen in verschiedenen Sprachen, das nicht in die 30 Zeilen passt, die OP als die richtige Code-Größe angedeutet hat. Anscheinend ist der Erkennungsalgorithmus in Mozilla integriert, so dass Sie ihn wahrscheinlich finden und extrahieren können.

Wir haben uns für ein viel einfacheres Schema entschieden: a) glauben Sie dem, was Ihnen gesagt wurde, wenn Sie das sagen, b) wenn nicht, überprüfen Sie auf BOM und glauben Sie, was es sagt, wenn vorhanden, ansonsten schnüffeln Sie für reine 7 Bit Ascii dann utf8 oder iso8859 in dieser Reihenfolge. Sie können eine hässliche Routine erstellen, die dies in einem Durchlauf über die Datei ausführt.

(Ich denke, dass das Problem mit der Zeit immer schlimmer wird. Unicode hat jedes Jahr eine neue Revision mit wirklich feinen Unterschieden in den gültigen Codepunkten. Um das richtig zu machen, müssen Sie jeden Codepunkt auf Gültigkeit überprüfen Glücklicherweise sind sie alle abwärtskompatibel.

[EDIT: OP scheint Probleme bei der Programmierung in Java zu haben. Unsere Lösung und die Skizze auf der anderen Seite sind nicht in Java codiert, so dass ich eine Antwort nicht direkt kopieren und einfügen kann. Ich werde hier eine Java-Version basierend auf seinem Code entwerfen; Es ist nicht kompiliert oder getestet. YMMV]

%Vor%     
Ira Baxter 03.03.2013 17:16
quelle

Tags und Links