Batch-Convert-Dateien für die Kodierung

54775
desolat

Wie kann ich mit einem Befehl oder Werkzeug Dateien in einem Verzeichnis zur Kodierung (z. B. ANSI-> UTF-8) stapelweise konvertieren?

Bei einzelnen Dateien hilft ein Editor, aber wie wird der Massendatensatz ausgeführt?

45
verwandt: http://stackoverflow.com/questions/724083/unix-newlines-to-windows-newlines-on-windows nagul vor 15 Jahren 1
http://stackoverflow.com/a/24713621/242933 ma11hew28 vor 10 Jahren 0

10 Antworten auf die Frage

34
quack quixote

Cygwin oder GnuWin32 bieten Unix-Tools wie iconvund dos2unix(und unix2dos). Unter Unix / Linux / Cygwin sollten Sie anstelle von ANSI "windows-1252" als Kodierung verwenden (siehe unten). (Wenn Sie nicht wissen, dass Ihr System eine andere Codepage als 1252 als Standard-Codepage verwendet, müssen Sie iconv die richtige Codepage mitteilen, aus der übersetzt werden soll.)

Konvertieren Sie von einem ( -f) zum anderen ( -t) mit:

$ iconv -f windows-1252 -t utf-8 infile > outfile 

Oder in einer Find-All-and-Conquer-Form:

## 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 Site 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. In der Tat ist ANSI eine Fehlbezeichnung . iconv kann nicht erraten, was Sie wollen.

Die ANSI-Kodierung ist die Kodierung, die von den "A" -Funktionen der Windows-API verwendet wird (die "W" -Funktionen verwenden UTF-16). Welche Kodierung dies entspricht, hängt in der Regel von Ihrer Windows-Systemsprache ab. Am gebräuchlichsten ist der CP 1252 (auch als Windows-1252 bekannt). Wenn Ihr Editor also ANSI sagt, bedeutet dies "Was auch immer die API-Funktionen als ANSI-Standardcodierung verwenden", dh die in Ihrem System verwendete Standardcodierung (nicht Unicode-Kodierung) (und normalerweise diejenige, die für Textdateien verwendet wird).

Die Seite, auf die er verweist, gibt diesen historischen Leckerbissen (zitiert aus einem Microsoft PDF- Dokument ) zu den Ursprüngen von CP 1252 und ISO-8859-1, einer anderen häufig verwendeten Kodierung:

Dies liegt daran, dass die Windows-Codepage 1252 ursprünglich auf einem ANSI-Entwurf beruhte, der zur ISO-Norm 8859-1 wurde. Beim Hinzufügen von Codepunkten zu dem Bereich, der für Steuercodes im ISO-Standard reserviert ist, wichen die Windows-Codepage 1252 und nachfolgende Windows-Codepages, die ursprünglich auf der ISO 8859-x-Serie basierten, jedoch von der ISO ab. Bis heute ist es nicht ungewöhnlich, dass die Entwicklergemeinde sowohl innerhalb als auch außerhalb von Microsoft die 8859-1-Codepage mit Windows 1252 verwechselt. Außerdem wird "ANSI" oder "A" verwendet, um die Unterstützung der Windows-Codepage zu kennzeichnen .

Verwenden Sie nicht denselben Dateinamen als Eingabe und Ausgabe! `iconv` scheint die Dateien auf 32.768 Byte zu verkürzen, wenn sie diese Größe überschreiten. Wenn er in die Datei schreibt, aus der er zu lesen versucht, erledigt er die Aufgabe, wenn die Datei klein genug ist. Andernfalls schneidet er die Datei ohne Warnung ab. Niavlys vor 10 Jahren 3
Zu Ihrer Information Diese Frage ist mit osx gekennzeichnet und sieht nicht so aus, als sei einer der Befehle convert-all für Yosemite oder El Cap geeignet. Die iconv-Version von Apples ships unterstützt --verbose oder -o nicht, und die Umleitung von stdout für andere Syntax funktioniert aus irgendeinem Grund nicht und sendet sie nur an reguläre stdout. Scott McIntyre vor 8 Jahren 1
27
akira

Mit Powershell kannst du so etwas machen:

% get-content IN.txt | out-file -encoding ENC -filepath OUT.txt 

während ENC so etwas wie Unicode, ASCII, UTF8, UTF32 ist. 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 } 
Das Konvertieren von ANSI in UTF über Ihren ersten Vorschlag löscht den gesamten Inhalt meiner Textdatei ... Acroneos vor 9 Jahren 0
@Acroneos: Dann hast du einen Fehler gemacht: Die In-Datei ist IN.txt, die Outfile ist OUT.txt ... Auf diese Weise kann das Original nicht überschrieben werden. Wenn Sie denselben Dateinamen für IN.txt und OUT.txt verwendet haben, überschreiben Sie offensichtlich die Datei, aus der Sie gerade lesen. akira vor 9 Jahren 0
Powershell konvertiert mit BOM in UTF. find und iconv könnte viel einfacher sein. pparas vor 7 Jahren 0
6
nagul

Die Wikipedia-Seite zu Newlines enthält einen Abschnitt zu Konvertierungsprogrammen .

Dies scheint die beste Wahl für eine Konvertierung zu sein, die nur Tools verwendet, die mit Windows geliefert werden:

TYPE unix_file | FIND "" /V > dos_file 
3
Tiler

UTFCast ist ein Unicode-Konverter für Windows, der den Batch-Modus unterstützt. Ich verwende die kostenpflichtige Version und fühle mich recht wohl damit.

UTFCast ist ein Unicode-Konverter, mit dem Sie alle Textdateien mit nur einem Mausklick in UTF-Codierungen konvertieren können. Sie können damit ein Verzeichnis mit Textdateien in UTF-Kodierungen wie UTF-8, UTF-16 und UTF-32 in ein Ausgabeverzeichnis konvertieren, wobei die Verzeichnisstruktur der Originaldateien erhalten bleibt. Es spielt keine Rolle, ob Ihre Textdatei eine andere Erweiterung hat. UTFCast kann Textdateien automatisch erkennen und konvertieren.

Anscheinend können sie nicht in denselben Ordner konvertieren, sondern nur in einen anderen Zielordner. Uwe Keim vor 8 Jahren 0
1
user1055927

Sie können EncodingMaster verwenden . Es ist kostenlos, hat eine Windows-, Linux- und Mac OS X-Version und funktioniert sehr gut.

Die von Ihnen erwähnte Website ist geschlossen. Etienne Delavennat vor 6 Jahren 0
1
Aneesh Garg

iconv -f original_charset -t utf-8 originalfile > newfile

Führen Sie den obigen Befehl in for-Schleife aus.

1
Serge Stroobandt

Oneliner mit find, mit automatischer Erkennung

Die Zeichenkodierung aller übereinstimmenden Textdateien wird automatisch erkannt und alle übereinstimmenden Textdateien werden in utf-8Kodierung 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 shmit verwendet -exec, die einen Einzeiler mit der -cMarkierung ausführt und den Dateinamen als Positionsargument "$1"mit übergibt -- {}. Dazwischen wird die utf-8Ausgabedatei vorübergehend benannt converted.

Der findBefehl ist für eine solche Dateiverwaltungsautomatisierung sehr nützlich.

Klicken Sie hier, um mehr zu finderfahren .

0
nik

Es gibt dos2unixUnix.
Es gab ein anderes ähnliches Tool für Windows (ein anderer Hinweis hier ).

Wie konvertiere ich zwischen Unix- und Windows-Textdateien? hat noch ein paar Tricks

`dos2unix` ist nützlich [um Zeilenumbrüche zu konvertieren] (http://en.wikipedia.org/wiki/Dos2unix), aber das OP sucht nach Zeichencodierungen. Sony Santos vor 10 Jahren 2
0
kinORnirvana

Verwenden Sie dieses Python-Skript: https://github.com/goerz/convert_encoding.py Funktioniert auf jeder Plattform. Benötigt Python 2.7.

0
Bedla

In meinem Anwendungsfall brauchte ich eine automatische Erkennung der Eingabecodierung, und es gab viele Dateien mit Windows-1250Codierung, für die der Befehl file -bi <FILE>zurückgegeben wird 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 in utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;