Ich muss die Codierung aller Dateien finden, die in einem Verzeichnis abgelegt sind. Gibt es eine Möglichkeit, die verwendete Codierung zu finden?
Der file
Befehl kann dies nicht.
Die für mich interessante Codierung lautet: ISO-8859-1. Wenn die Codierung etwas anderes ist, möchte ich die Datei in ein anderes Verzeichnis verschieben.
apropos encoding
. Es durchsucht die Titel und Beschreibungen aller Manpages. Wenn ich dies tun auf meiner Maschine, ich sehe drei Tools , die mir helfen könnten, durch ihre Beschreibungen zu urteilen:chardet
,chardet3
,chardetect3
.man chardet
Wenn ich dann die Manpage mache und lese, weiß ich, dass dieschardet
genau das Dienstprogramm ist, das ich brauche.us-ascii
, aber nach dem Hinzufügen einer Zeile mit chinesischen Kommentaren wird esutf-8
.file
kann die Codierung durch Lesen des Dateiinhalts und der Vermutung erkennen.Antworten:
Klingt wie Sie suchen
enca
. Es kann zwischen Codierungen raten und sogar konvertieren. Schauen Sie sich einfach die Manpage an .Andernfalls verwenden Sie
file -i
(Linux) oderfile -I
(Osx). Dadurch werden Informationen vom Typ MIME für die Datei ausgegeben, die auch die Zeichensatzcodierung enthalten. Ich habe auch eine Manpage dafür gefunden :)quelle
enca
Es scheint völlig nutzlos zu sein, eine auf Englisch geschriebene Datei zu analysieren. Wenn Sie sich jedoch etwas auf Estnisch ansehen, kann dies möglicherweise alle Ihre Probleme lösen. Sehr hilfreiches Tool, das ... </Wenn Sie dies für eine Reihe von Dateien tun möchten
quelle
Do not prepend filenames to output lines
file -b --mime-encoding
uchardet - Eine von Mozilla portierte Codierungsdetektorbibliothek.
Verwendungszweck:
Verschiedene Linux-Distributionen (Debian / Ubuntu, OpenSuse-Packman, ...) bieten Binärdateien.
quelle
sudo apt-get install uchardet
ist so einfach, dass ich beschlossen habe, mir darüber keine Sorgen zu machen ...uchardet
hat einen großen Vorteil gegenüberfile
und darinenca
, dass es die gesamte Datei analysiert (nur mit einer 20GiB-Datei versucht), im Gegensatz zu nur dem Anfang.Hier ist ein Beispielskript mit Datei -I und iconv, das unter MacOsX funktioniert. Für Ihre Frage müssen Sie mv anstelle von iconv verwenden
quelle
file -b --mime-encoding
gibt nur den Zeichensatz aus, so dass Sie jede Pipe-Verarbeitung vermeiden könnenEs ist wirklich schwer festzustellen, ob es sich um ISO-8859-1 handelt. Wenn Sie einen Text mit nur 7-Bit-Zeichen haben, der auch iso-8859-1 sein könnte, aber Sie wissen es nicht. Wenn Sie 8-Bit-Zeichen haben, sind die Zeichen des oberen Bereichs auch in der Reihenfolge der Codierungen vorhanden. Daher müssten Sie ein Wörterbuch verwenden, um besser zu erraten, um welches Wort es sich handelt, und um von dort aus zu bestimmen, welcher Buchstabe es sein muss. Wenn Sie schließlich feststellen, dass es sich möglicherweise um utf-8 handelt, sind Sie sicher, dass es sich nicht um iso-8859-1 handelt
Das Codieren ist eines der schwierigsten Dinge, weil Sie nie wissen, ob Ihnen nichts sagt
quelle
In Debian können Sie auch:
encguess
:quelle
uchardet
in Ubuntu installiert und es hat mir gesagt, dass meine Datei warWINDOWS-1252
. Ich weiß, dass dies falsch war, weil ich es mit Kate als UTF-16 gespeichert habe, um es zu testen. Allerdingsencguess
denkt , richtig, und es wurde in Ubuntu 19.04 vorinstalliert.So konvertieren Sie die Codierung von 8859 in ASCII:
quelle
Mit Python können Sie das Chardet-Modul verwenden: https://github.com/chardet/chardet
quelle
Dies können Sie nicht kinderleicht tun. Eine Möglichkeit wäre, jedes Zeichen in der Datei zu prüfen , um sicherzustellen , dass es keine Zeichen enthält in den Bereichen
0x00 - 0x1f
oder0x7f -0x9f
aber, wie gesagt, dies mag wahr sein , für eine beliebige Anzahl von Dateien, einschließlich mindestens einer anderen Variante von ISO8859.Eine andere Möglichkeit besteht darin, in allen unterstützten Sprachen nach bestimmten Wörtern in der Datei zu suchen und zu prüfen, ob Sie sie finden können.
Suchen Sie beispielsweise in allen unterstützten Sprachen von 8859-1 das Äquivalent von Englisch "und", "aber", "zu", "von" usw. und prüfen Sie, ob sie eine große Anzahl von Vorkommen in der Sprache enthalten Datei.
Ich spreche nicht von wörtlicher Übersetzung wie:
obwohl das möglich ist. Ich spreche über gebräuchliche Wörter in der Zielsprache (nach allem, was ich weiß, hat Isländisch kein Wort für "und" - Sie müssten wahrscheinlich ihr Wort für "Fisch" verwenden [Entschuldigung, das ist ein wenig stereotyp, habe ich nicht meine jede Straftat, nur um einen Punkt zu veranschaulichen]).
quelle
Ich weiß, dass Sie an einer allgemeineren Antwort interessiert sind, aber was in ASCII gut ist, ist normalerweise in anderen Codierungen gut. Hier ist ein Python-Einzeiler, um festzustellen, ob die Standardeingabe ASCII ist. (Ich bin mir ziemlich sicher, dass dies in Python 2 funktioniert, aber ich habe es nur auf Python 3 getestet.)
quelle
Wenn es sich um XML-Dateien handelt (ISO-8859-1), gibt die darin enthaltene XML-Deklaration die Codierung an:
<?xml version="1.0" encoding="ISO-8859-1" ?>
Sie können also reguläre Ausdrücke (z. B. mit
perl
) verwenden, um jede Datei auf eine solche Spezifikation zu überprüfen.Weitere Informationen finden Sie hier: So bestimmen Sie die Codierung von Textdateien .
quelle
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 (Listenreihenfolge erkennen) eingefügt habe, die möglicherweise übereinstimmen. Um ein genaueres Ergebnis zu erhalten, können Sie alle möglichen Codierungen verwenden über: mb_list_encodings ()
Hinweis mb_ * -Funktionen erfordern php-mbstring
quelle
In Cygwin sieht das so aus, als würde es bei mir funktionieren:
Beispiel:
Sie können dies an awk weiterleiten und einen iconv-Befehl erstellen, um alles von jeder von iconv unterstützten Quellcodierung in utf8 zu konvertieren.
Beispiel:
quelle
Sie können die Codierung einer einzelnen Datei mit dem Befehl file extrahieren. Ich habe eine sample.html-Datei mit:
sample.html: HTML-Dokument, UTF-8-Unicode-Text mit sehr langen Zeilen
HTML-Dokument, UTF-8-Unicode-Text, mit sehr langen Zeilen
Text / HTML; Zeichensatz = utf-8
utf-8
quelle
Ich benutze das folgende Skript um
.
quelle
mit diesem Befehl:
Sie können alle Dateien in einem Verzeichnis und Unterverzeichnissen sowie die entsprechende Codierung auflisten.
quelle
Verwenden Sie in Perl Encode :: Detect.
quelle