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?
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?
Antworten:
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 file
Befehl 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.
Ein Programm namens file
kann 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
.
file
macht 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.
.sql
Datei zu finden und file
zeigte mir, dass es sich tatsächlich um eine gzip
komprimierte Datei handelt!
piconv
um die Kodierung zu ändern;)