Wie kann ich die Codierung einer Textdatei testen? Ist sie gültig und was ist sie?

46

Ich habe mehrere .htmDateien, die ohne Warnung / Fehler in Gedit geöffnet werden. Wenn ich jedoch dieselben Dateien in öffne Jedit, werde ich vor ungültiger UTF-8-Codierung gewarnt ...

Das HTML-Meta-Tag lautet "charset = ISO-8859-1". Jedit erlaubt eine Liste von Fallback-Codierungen und eine Liste von Codierungsautodetektoren (derzeit "BOM XML-PI"), sodass mein unmittelbares Problem behoben wurde. Aber das brachte mich zum Nachdenken: Was wäre, wenn die Metadaten nicht da wären?

Wenn die Codierungsinformationen gerade nicht verfügbar sind, gibt es ein CLI-Programm, das eine "Vermutung" darüber anstellen kann, welche Codierungen möglicherweise zutreffen?

Und obwohl es ein etwas anderes Thema ist; Gibt es ein CLI-Programm, das die Gültigkeit einer bekannten Codierung testet ?

Peter.O
quelle
Ähnlich wie bei "Automatische Erkennung der Codierung von Textdateien". superuser.com/questions/301552/...
buzz3791
Siehe auch stackoverflow.com/q/805418/821436 :-)
Setzen Sie Monica - M. Schröder

Antworten:

60

Der fileBefehl macht "Best-Rates" über die Codierung. Verwenden Sie den -iParameter, um filedas Drucken von Informationen zur Codierung zu erzwingen .

Demonstration:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

So habe ich die Dateien erstellt:

$ echo ä > umlaut-utf8.txt 

Heutzutage ist alles utf-8. Aber überzeugen Sie sich selbst:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

Vergleichen Sie mit https://en.wikipedia.org/wiki/Ä#Computer_encoding

Konvertieren Sie in die anderen Kodierungen:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

Überprüfen Sie den Hex-Dump:

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

Erstelle etwas "Ungültiges", indem du alle drei mischst:

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

Was filesagt:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

ohne -i:

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

Der fileBefehl hat keine Ahnung von "gültig" oder "ungültig". Es werden nur einige Bytes angezeigt, und es wird versucht, die Codierung zu erraten. Als Mensch können wir möglicherweise erkennen, dass eine Datei eine Textdatei mit einigen Umlauten in einer "falschen" Codierung ist. Aber als Computer würde es eine Art künstliche Intelligenz brauchen.

Man könnte argumentieren, dass die Heuristik fileeine Art künstliche Intelligenz ist. Aber selbst wenn es so ist, ist es sehr begrenzt.

Hier finden Sie weitere Informationen zum fileBefehl: http://www.linfo.org/file_command.html

Lesmana
quelle
Danke, das hat , but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1. geklappt ... Ich hatte versucht "file file -i" zu melden unknown-8bit. Dies scheint also auch die Antwort zu sein auf: "Erkennen einer ungültigen / unbekannten Codierung"
Peter.O
Für diejenigen, die hierher kommen und auf einem Mac arbeiten, ist es file -Imit einem Großbuchstaben "i" anstelle von Kleinbuchstaben.
Samuraiseoul
21

Es ist nicht immer möglich, die Kodierung einer Textdatei genau zu bestimmen. Beispielsweise könnte die Bytefolge \303\275( c3 bdhexadezimal) ýin UTF-8 oder ýin latin1 oder Ă˝in latin2 oder in BIG-5 usw. sein.

Einige Codierungen haben ungültige Byte-Sequenzen, daher können Sie diese mit Sicherheit ausschließen. Dies gilt insbesondere für UTF-8; Die meisten Texte in den meisten 8-Bit-Codierungen sind nicht UTF-8-gültig. Sie können für gültige UTF-8 Test mit isutf8von moreutils oder mit iconv -f utf-8 -t utf-8 >/dev/null, unter anderem.

Es gibt Tools, die versuchen, die Kodierung einer Textdatei zu erraten. Sie können Fehler machen, aber sie funktionieren oft in der Praxis, solange Sie nicht absichtlich versuchen, sie zu täuschen.

  • file
  • PerlEncode::Guess (Teil der Standarddistribution) versucht, eine Byte-Zeichenfolge nacheinander zu codieren, und gibt die erste Codierung zurück, in der die Zeichenfolge gültigen Text enthält.
  • Enca ist ein Kodierer und Konverter. Sie können einen Sprachnamen vergeben und davon ausgehen, dass der Text in dieser Sprache verfasst ist (die unterstützten Sprachen sind hauptsächlich osteuropäische Sprachen), und es wird versucht, die Kodierung zu erraten.

Wenn die Datei Metadaten (HTML / XML charset=, TeX \inputenc, Emacs usw. -*-coding-*-) enthält, können fortgeschrittene Editoren wie Emacs oder Vim diese Metadaten häufig analysieren. Dies ist jedoch nicht einfach über die Befehlszeile zu automatisieren.

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank für die gute Übersicht ... Ja, "Best-Guess" kann die einzige Option sein, wenn die Codierung nicht bekannt ist ... Mit habe iconvich gerade alle 1168 Codierungen (einschließlich Aliase), die von aufgelistet wurden, mit iconv -leiner meiner .htm-Dateien verglichen ... Es gab 683 Codierungen, die das Muster bestanden haben. Der tatsächliche Zeichensatz der Datei = ISO-8859-1. Besteht aus allen ASCII-Bereichswerten mit einem Balken. Das Nicht-ASCII-Zeichen war \ xA9.
Peter.O
0

Auch wenn Sie Datei -i gibt Ihnen unbekannt

Sie können diesen PHP-Befehl verwenden, der den folgenden Zeichensatz erraten kann:

In PHP können Sie wie folgt überprüfen:

Codierungsliste explizit angeben:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Genauere " mb_list_encodings ":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Hier im ersten Beispiel können Sie sehen, dass ich eine Liste von Codierungen (Erkennungslistenreihenfolge) erstellt habe, die möglicherweise übereinstimmen. Um ein genaueres Ergebnis zu erhalten, können Sie alle möglichen Kodierungen verwenden: mb_list_encodings ()

Hinweis Für mb_ * -Funktionen ist php-mbstring erforderlich

apt-get install php-mbstring 

Siehe Antwort: https://stackoverflow.com/a/57010566/3382822

Mohamed23gharbi
quelle