Frage

Mein Programm hat Dateien, die verwenden verschiedene Kodierungen zu lesen. Sie können ANSI, UTF-8 oder UTF-16 (groß oder Little-Endian).

Wenn die BOM (Byte Order Mark) ist, habe ich kein Problem. Ich weiß, wenn die Datei UTF-8 oder UTF-16 BE oder LE.

Ich wollte zu übernehmen, wenn es keine BOM war, dass die Datei ANSI war. Aber ich habe festgestellt, dass die Dateien, die ich mit oft zu tun habe ihre BOM fehlt. Daher kann keine BOM bedeuten, dass die Datei ANSI ist, UTF-8, UTF-16 BE oder LE.

Wenn die Datei keine BOM hat, was der beste Weg wäre, einen Teil der Datei und am genauesten denkt, die Art der Codierung zu scannen? Ich mag direkt in der Nähe von 100% der Zeit sein, wenn die Datei ANSI ist und in den hohen 90ern, wenn es ein UTF-Format ist.

Ich suche nach einem allgemeinen algorithmischen Weg, dies zu bestimmen. Aber ich benutze eigentlich Delphi 2009, die Unicode-weiß und hat eine TEncoding Klasse, so etwas Bestimmtes, dass wäre ein Bonus.


Antwort:

ShreevatsaR Antwort führte mich auf Google für „Universal-Codierung Detektor delphi“ zu suchen, das mich diesen Beitrag in mit in Position # 1 aufgelistet überraschte nach nur etwa 45 Minuten am Leben zu sein! Das ist schnell googlebotting !! Und auch erstaunlich, dass Stackoverflow 1. Platz bekommt in so schnell.

Der zweite Eintrag in Google war ein Blog-Eintrag von Fred Eaker auf Charakter Codierungserkennung , die aufgeführt Algorithmen in verschiedenen Sprachen.

fand ich die Erwähnung von Delphi auf dieser Seite, und es führte mich direkt in Delphi geschrieben und basiert auf Mozilla-i18n-Komponente.

Fantastic! Vielen Dank alle, die (alle 1) beantwortet, danke ShreevatsaR, und nochmals vielen Dank Stackoverflow, mir geholfen, meine Antwort in weniger als einer Stunde zu finden!

War es hilfreich?

Lösung

Vielleicht können Sie zu einem Python-Skript berappen, die Chardet: Universal-Encoding-Detektor . Es ist ein Reimplementation der Zeichencodierung, die durch den folgenden Nachweis verwendet und wird von . Nützliche Links: Mozillas Code , kurze Erklärung , detaillierte Erklärung .

Andere Tipps

Hier ist wie Notizblock tut das

Es gibt auch den Python Universal-Encoding-Detektor den Sie überprüfen.

Meine Vermutung ist:

  • Überprüfen Sie zunächst, ob die Datei Byte-Werte von weniger als 32 (mit Ausnahme der Reiter / Zeilenumbrüche). Ist dies der Fall, kann es nicht ANSI oder UTF-8 sein. So - UTF-16. Sie müssen nur den endianness herauszufinden. Dazu sollten Sie wahrscheinlich eine Tabelle der gültigen Unicode-Zeichencodes verwenden. Wenn Sie ungültige Codes auftreten, versuchen Sie die anderen endianness wenn das passt. Wenn entweder fit (oder nicht), prüfen Sie, welche einen größeren Prozentsatz von alphanumerischen Codes hat. Auch könnten Sie searchung für Zeilenumbrüche versuchen und bestimmen endianness von ihnen. Other than that, ich habe keine Ideen, wie für endianness zu überprüfen.
  • Wenn die Datei keine Werte weniger enthält als 32 (abgesehen von dem Leerzeichen), ist es wahrscheinlich ANSI oder UTF-8. Versuchen Sie es als UTF-8-Parsing und sehen Sie, wenn Sie irgendwelche ungültige Unicode-Zeichen erhalten. Wenn Sie das tun, ist es wahrscheinlich ANSI.
  • Wenn Sie Dokumente in nicht-englischen Single-Byte oder Multi-Byte-Nicht-Unicode-Codierung erwarten, dann sind Sie kein Glück. Das Beste, was Sie tun können, ist so etwas wie Internet Explorer, die ein Histogramm der Zeichenwerte machen und vergleicht sie mit Histogrammen von bekannten Sprachen. Es funktioniert ziemlich oft, aber manchmal nicht zu. Und Sie werden eine große Bibliothek von Buchstaben Histogramme für jede Sprache haben müssen.

ASCII? Keine modernen OS verwenden ASCII mehr. Sie verwenden alle 8-Bit-Codes, zumindest, was bedeutet, es wird entweder UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS oder was sonst ist da draußen.

Der einzige Test, den ich kenne, ist für ungültige UTF-8 Zeichen zu überprüfen. Wenn Sie eine finden, dann wissen Sie es nicht UTF-8 sein kann. Dasselbe ist wahrscheinlich möglich, UTF-16. Aber wenn es keine Unicode-Satz ist, dann wird es schwer zu sagen, welche Windows-Codepage es auch sein mag.

Die meisten Editoren ich mit diesem wissen beschäftigen, indem der Benutzer eine Standard aus der Liste aller möglichen Kodierungen wählen zu lassen.

Es gibt Code gibt zur Prüfung der Gültigkeit von UTF Zeichen.

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