Wie kann ich sehen, welche Codierung in einer Datei verwendet wird?

23

Ich hatte einige Probleme mit Untertiteldateien im Video-Omxplayer. Um das Problem zu lösen, musste ich von Windows-1250 auf UTF-8-Codierung konvertieren. Meine Frage ist, wie kann ich für eine bestimmte Datei sehen, welche Codierung verwendet wird?

NonStandardModel
quelle
piconvum die Kodierung zu ändern;)
Rinzwind
Ja. Ich habe bereits die Kodierung geändert (in 1 Datei). Aber ich habe viele davon und wollte ein kleines Skript erstellen, das sie alle kontrolliert und bei Bedarf verdeckt. Aber ich nehme an, ich kann einfach alle konvertieren. Es wird kein Schaden angerichtet, wenn einige bereits in UTF-8 enthalten sind. Recht?
NonStandardModel
Kein Problem, nein :) Verwenden Sie einfach eine Wildcard
Rinzwind

Antworten:

26

Sie können nicht wirklich automatisch herausfinden, ob eine Datei ursprünglich mit der Kodierung X geschrieben wurde.

Was Sie jedoch leicht tun können, ist zu überprüfen, ob die gesamte Datei mit einem bestimmten Codec irgendwie (aber nicht unbedingt richtig) erfolgreich dekodiert werden kann. Wenn Sie Bytes finden, die für eine bestimmte Codierung nicht gültig sind, muss es sich um etwas anderes handeln.

Das Problem ist, dass viele Codecs ähnlich sind und die gleichen "gültigen Bytemuster" haben, nur dass sie als unterschiedliche Zeichen interpretiert werden. Beispielsweise äkönnte eine in einer Codierung in einer éanderen oder øin einer dritten entsprechen. Der Computer kann nicht wirklich erkennen, auf welche Weise das Byte interpretiert werden kann, was zu korrekt lesbarem Text führt (es sei denn, Sie fügen ein Wörterbuch für alle Arten von Sprachen hinzu und lassen Rechtschreibprüfungen durchführen ...). Sie müssen auch wissen, dass einige Zeichensätze tatsächlich Teilmengen anderer sind, wie z. B. die ASCII-Codierung ein Teil der am häufigsten verwendeten Codecs wie einige der ANSI-Familie oder UTF-8. Das bedeutet zum Beispiel, dass ein als UTF-8 gespeicherter Text, der nur einfache lateinische Zeichen enthält, mit der gleichen Datei identisch ist, die als ASCII gespeichert wurde.


Kommen wir jedoch von der Erklärung, was Sie nicht können, zu dem zurück, was Sie tatsächlich können:

Für eine grundlegende Überprüfung von ASCII- / Nicht-ASCII-Textdateien (normalerweise UTF-8) können Sie den fileBefehl verwenden. Es kennt jedoch nicht viele Codecs und untersucht nur die ersten paar kB einer Datei, vorausgesetzt, der Rest enthält keine neuen Zeichen. Andererseits erkennt es auch andere gängige Dateitypen wie verschiedene Skripte, HTML / XML-Dokumente und viele Binärdatenformate (was für den Vergleich von Textdateien jedoch alles andere als interessant ist) und gibt möglicherweise zusätzliche Informationen darüber aus, ob es extrem lange Zeilen gibt oder welche Typ der Newline-Sequenz (zB UNIX: LF, Windows: CR + LF) wird verwendet.

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

Wenn das nicht ausreicht, kann ich Ihnen das Python-Skript anbieten, das ich für diese Antwort hier geschrieben habe . Es scannt vollständige Dateien und versucht, sie mit einem bestimmten Zeichensatz zu dekodieren. Wenn dies erfolgreich ist, ist diese Codierung ein potenzieller Kandidat. Andernfalls können Sie, wenn es Bytes gibt, die nicht damit decodiert werden können, diesen Zeichensatz aus Ihrer Liste entfernen.

Byte Commander
quelle
ANSI ist nicht wirklich der Name einer Zeichenkodierung. Vielleicht denken Sie an ANSI-Escape-Codes, die mit der ASCII-Zeichencodierung ausgedrückt werden können.
Kasperd
@kasperd Wahrscheinlich bezieht er sich auf eine der Codepage-Familien ISO 8859 oder Windows. Für nordamerikanische Windows-Entwickler bedeutet ANSI-Codierung aus historischen Gründen häufig die Windows 1252-Codierung.
user1937198
Ja, also, ANSI ist im Grunde genommen ASCII (Codes 0-127) plus eine länderspezifische Codepage (Codes 128-255). Also hast du recht ...
Byte Commander
Weitere Informationen: Was ist das ANSI-Format?
wjandrea
12

Ein Programm namens filekann dies tun. Beispiel:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

Wenn Sie interessiert sind, wie es gemacht wird, sehen Sie src/encoding.c.

Arkadiusz Drabczyk
quelle
2
Es kann sowieso erraten .
Hobbs
2
filemacht eine Vermutung, und häufig ist es nicht sehr gut. In meinen Tests wurden beispielsweise sowohl MacRoman als auch CP-1252 als ISO-8859 falsch identifiziert, mit dem Ergebnis, dass "š" und "ß" verschlüsselt wurden.
Mark
Großartig 👌! Verbrachte einige Stunden damit, die korrekte Kodierung meiner alten .sqlDatei zu finden und filezeigte mir, dass es sich tatsächlich um eine gzipkomprimierte Datei handelt!
Amirreza Nasiri