Ich habe mehrere .htm
Dateien, 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 ?
Antworten:
Der
file
Befehl macht "Best-Rates" über die Codierung. Verwenden Sie den-i
Parameter, umfile
das Drucken von Informationen zur Codierung zu erzwingen .Demonstration:
So habe ich die Dateien erstellt:
Heutzutage ist alles utf-8. Aber überzeugen Sie sich selbst:
Vergleichen Sie mit https://en.wikipedia.org/wiki/Ä#Computer_encoding
Konvertieren Sie in die anderen Kodierungen:
Überprüfen Sie den Hex-Dump:
Erstelle etwas "Ungültiges", indem du alle drei mischst:
Was
file
sagt:ohne
-i
:Der
file
Befehl 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
file
eine Art künstliche Intelligenz ist. Aber selbst wenn es so ist, ist es sehr begrenzt.Hier finden Sie weitere Informationen zum
file
Befehl: http://www.linfo.org/file_command.htmlquelle
, 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 meldenunknown-8bit
. Dies scheint also auch die Antwort zu sein auf: "Erkennen einer ungültigen / unbekannten Codierung"file -I
mit einem Großbuchstaben "i" anstelle von Kleinbuchstaben.Es ist nicht immer möglich, die Kodierung einer Textdatei genau zu bestimmen. Beispielsweise könnte die Bytefolge
\303\275
(c3 bd
hexadezimal)ý
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
isutf8
von moreutils oder miticonv -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
Encode::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.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.quelle
iconv
ich gerade alle 1168 Codierungen (einschließlich Aliase), die von aufgelistet wurden, miticonv -l
einer 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.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:
Genauere " mb_list_encodings ":
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
Siehe Antwort: https://stackoverflow.com/a/57010566/3382822
quelle