Wie kann ich Dateien in einem Verzeichnis für ihre Codierung (z. B. ANSI-> UTF-8) mit einem Befehl oder Tool stapelweise konvertieren?
Für einzelne Dateien hilft ein Editor, aber wie erledigt man die Massendateien?
Wie kann ich Dateien in einem Verzeichnis für ihre Codierung (z. B. ANSI-> UTF-8) mit einem Befehl oder Tool stapelweise konvertieren?
Für einzelne Dateien hilft ein Editor, aber wie erledigt man die Massendateien?
Antworten:
Cygwin oder GnuWin32 bieten Unix-Tools wie iconv
und dos2unix
(und unix2dos
). Unter Unix / Linux / Cygwin möchten Sie "windows-1252" anstelle von ANSI als Codierung verwenden (siehe unten). (Sofern Sie nicht wissen, dass Ihr System eine andere Codepage als 1252 als Standard-Codepage verwendet, müssen Sie in diesem Fall iconv mitteilen, von welcher Codepage die Übersetzung erfolgen soll.)
Konvertieren Sie von einem ( -f
) zum anderen ( -t
) mit:
$ iconv -f windows-1252 -t utf-8 infile > outfile
Oder in der Form, alles zu finden und zu erobern:
## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;
Alternative:
## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;
Diese Frage wurde auf dieser Website schon oft gestellt. Hier finden Sie einige zusätzliche Informationen zu "ANSI". In einer Antwort auf eine verwandte Frage erwähnt CesarB :
Es gibt verschiedene Kodierungen, die in Windows "ANSI" genannt werden. Tatsächlich ist ANSI eine falsche Bezeichnung . iconv kann nicht erraten, was Sie wollen.
Die ANSI-Codierung ist die Codierung, die von den "A" -Funktionen in der Windows-API verwendet wird (die "W" -Funktionen verwenden UTF-16). Welcher Codierung sie entspricht, hängt normalerweise von Ihrer Windows-Systemsprache ab. Am gebräuchlichsten ist CP 1252 (auch als Windows-1252 bekannt). Wenn Ihr Editor also ANSI sagt, bedeutet dies "was auch immer die API-Funktionen als Standard-ANSI-Codierung verwenden". Dies ist die in Ihrem System standardmäßig verwendete Nicht-Unicode-Codierung (und daher normalerweise diejenige, die für Textdateien verwendet wird).
Die Seite, auf die er verweist, gibt diesen historischen Leckerbissen (zitiert aus einem Microsoft PDF ) über die Ursprünge von CP 1252 und ISO-8859-1, einer weiteren häufig verwendeten Codierung:
Dies ist darauf zurückzuführen, dass die Windows-Codepage 1252 ursprünglich auf einem ANSI-Entwurf basierte, der zum ISO-Standard 8859-1 wurde. Beim Hinzufügen von Codepunkten zu dem Bereich, der für Steuercodes im ISO-Standard reserviert ist, weichen die Windows-Codepage 1252 und nachfolgende Windows-Codepages, die ursprünglich auf der ISO 8859-x-Serie basieren, von der ISO ab. Bis heute ist es nicht ungewöhnlich, dass die Entwicklergemeinschaft innerhalb und außerhalb von Microsoft die Codepage 8859-1 mit Windows 1252 verwechselt und "ANSI" oder "A" zur Kennzeichnung der Windows-Codepageunterstützung verwendet .
iconv
scheint Dateien auf 32.768 Byte zu kürzen, wenn sie diese Größe überschreiten. Während er in die Datei schreibt, aus der er zu lesen versucht, schafft er es, die Arbeit zu erledigen, wenn die Datei klein genug ist, ansonsten
Mit Powershell können Sie so etwas tun:
% get-content IN.txt | out-file -encoding ENC -filepath OUT.txt
während ENC ist so etwas wie Unicode, ASCII, UTF8, UTF32. checkout 'help out-file'.
So konvertieren Sie alle * .txt-Dateien in einem Verzeichnis nach utf8:
% foreach($i in ls -name DIR/*.txt) { \
get-content DIR/$i | \
out-file -encoding utf8 -filepath DIR2/$i \
}
Dadurch wird eine konvertierte Version jeder TXT-Datei in DIR2 erstellt.
BEARBEITEN: Um die Dateien in allen Unterverzeichnissen zu ersetzen, verwenden Sie:
% foreach($i in ls -recurse -filter "*.java") {
$temp = get-content $i.fullname
out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}
Die Wikipedia-Seite zu Zeilenumbrüchen enthält einen Abschnitt zu Konvertierungsdienstprogrammen .
Dies scheint die beste Wahl für eine Konvertierung zu sein, die nur Tools verwendet, mit denen Windows ausgeliefert wird:
TYPE unix_file | FIND "" /V > dos_file
UTFCast ist ein Unicode-Konverter für Windows, der den Batch-Modus unterstützt. Ich benutze die kostenpflichtige Version und bin ziemlich zufrieden damit.
UTFCast ist ein Unicode-Konverter, mit dem Sie alle Textdateien mit nur einem Mausklick stapelweise in UTF-Codierungen konvertieren können. Sie können damit ein Verzeichnis mit Textdateien in UTF-Codierungen wie UTF-8, UTF-16 und UTF-32 in ein Ausgabeverzeichnis konvertieren und dabei die Verzeichnisstruktur der Originaldateien beibehalten. Es spielt keine Rolle, ob Ihre Textdatei eine andere Erweiterung hat, UTFCast kann Textdateien automatisch erkennen und konvertieren.
Die Zeichenkodierung aller übereinstimmenden Textdateien wird automatisch erkannt und alle übereinstimmenden Textdateien werden in utf-8
Kodierung konvertiert :
$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;
Um diese Schritte auszuführen, wird eine Sub-Shell sh
verwendet -exec
, die einen Einzeiler mit dem -c
Flag ausführt und den Dateinamen als Positionsargument "$1"
mit übergibt -- {}
. Dazwischen wird die utf-8
Ausgabedatei temporär benannt converted
.
Der find
Befehl ist für eine solche Dateiverwaltungsautomatisierung sehr nützlich.
Klicken Sie hier, um mehr zu find
erfahren .
iconv -f original_charset -t utf-8 originalfile > newfile
Führen Sie den obigen Befehl in der for-Schleife aus.
Verwenden Sie dieses Python-Skript: https://github.com/goerz/convert_encoding.py. Es funktioniert auf jeder Plattform. Benötigt Python 2.7.
Es gibt dos2unix
unter Unix.
Es gab ein anderes ähnliches Tool für Windows (eine andere Referenz hier ).
Wie konvertiere ich zwischen Unix- und Windows-Textdateien? hat noch ein paar Tricks
dos2unix
ist nützlich , um Zeilenumbrüche zu konvertieren , aber das OP sucht nach der Konvertierung von Zeichencodierungen.
Sie können EncodingMaster verwenden . Es ist kostenlos, es hat eine Windows-, Linux- und Mac OS X-Version und funktioniert wirklich gut.
In meinem Anwendungsfall brauchte ich eine automatische Erkennung der Eingabecodierung und es gab viele Dateien mit Windows-1250
Codierung, für die der Befehl file -bi <FILE>
zurückgibt charset=unknown-8bit
. Dies ist kein gültiger Parameter für iconv
.
Ich habe mit enca die besten Ergebnisse erzielt .
Konvertieren Sie alle Dateien mit der Erweiterung txt nach utf-8
find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;