Es gibt viele reine Textdateien, die in verschiedenen Zeichensätzen codiert wurden.
Ich möchte sie alle in UTF-8 konvertieren, aber bevor iconv ausgeführt wird, muss ich die ursprüngliche Codierung kennen. Die meisten Browser haben eine Auto Detect
Kodierungsoption. Ich kann diese Textdateien jedoch nicht einzeln prüfen, da zu viele vorhanden sind.
Erst nachdem ich die ursprüngliche Kodierung gekannt habe, kann ich die Texte nach konvertieren iconv -f DETECTED_CHARSET -t utf-8
.
Gibt es ein Dienstprogramm zum Erkennen der Codierung von Nur-Text-Dateien? Es muss NICHT 100% perfekt sein, es macht mir nichts aus, wenn 100 Dateien in 1.000.000 Dateien falsch konvertiert sind.
python-chardet
in Ubuntu Universum Repo verpackt .chardet
wird trotzdem die richtigste Vermutung abgegeben, wie./a.txt: GB2312 (confidence: 0.99)
. Verglichen mit Enca, das gerade fehlgeschlagen ist und "Nicht erkannte Codierung" meldet. Läuft leiderchardet
sehr langsam.chardet <(head -c4000 filename.txt)
war für meinen Anwendungsfall viel schneller und genauso erfolgreich. (falls es nicht klar ist, sendet diese Bash-Syntax nur die ersten 4000 Bytes an chardet)chardet==3.0.4
, und der tatsächliche Name der ausführbaren Datei des Befehlszeilentools istchardetect
nichtchardet
.Ich würde diesen einfachen Befehl verwenden:
Oder wenn Sie nur den tatsächlichen Zeichensatz möchten (wie
utf-8
):quelle
file
Erkennt leider nur Kodierungen mit bestimmten Eigenschaften wie UTF-8 oder UTF-16. Der Rest - die alte ISO8859 oder ihre MS-DOS- und Windows-Korrespondenten - wird als "unknown-8bit" oder ähnliches aufgeführt, selbst für Dateien, diechardet
mit 99% iger Sicherheit erkannt werden .Unter Debian-basierten Linux bietet das uchardet- Paket ( Debian / Ubuntu ) ein Befehlszeilentool. Siehe unten die Paketbeschreibung:
quelle
uchardet
über Homebrew installiert wird.iconv
funktioniert.Für Linux gibt es enca und für Solaris können Sie auto_ef verwenden .
quelle
enca -d -L zh ./a.txt
fehlgeschlagen mit Meldung./a.txt: Unrecognized encoding Failure reason: No clear winner.
Wie bei @grawity erwähnt,chardet
ist es lockerer, allerdings ist es noch zu langsam.Mozilla hat eine nette Codebasis für die automatische Erkennung in Webseiten:
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
Detaillierte Beschreibung des Algorithmus:
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
quelle
Zurück zu chardet (Python 2.?) Reicht dieser Aufruf möglicherweise aus:
Obwohl es alles andere als perfekt ist ...
quelle
Für diejenigen, die regelmäßig Emacs verwenden, ist möglicherweise Folgendes hilfreich (ermöglicht die manuelle Überprüfung und Validierung der Transfomation).
Außerdem stelle ich häufig fest, dass die automatische Erkennung von Emacs-Zeichensätzen wesentlich effizienter ist als die anderen Tools zur automatischen Erkennung von Zeichensätzen (z. B. chardet).
Dann erledigt ein einfacher Aufruf von Emacs mit diesem Skript als Argument (siehe die Option "-l") den Job.
quelle
UTFCast ist einen Versuch wert. Hat bei mir nicht funktioniert (vielleicht weil meine Dateien schrecklich sind), aber es sieht gut aus.
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
quelle
isutf8
(aus demmoreutils
Paket) hat den Job gemachtquelle
Auch für den Fall, dass 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 sehen Sie, dass ich eine Liste von Codierungen (Erkennungslistenreihenfolge) erstellt habe, die möglicherweise übereinstimmen. Um genauere Ergebnisse 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