Batch-Konvertierung von Dateien für die Codierung


Antworten:


36

Cygwin oder GnuWin32 bieten Unix-Tools wie iconvund 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 .


4
Verwenden Sie nicht den gleichen Dateinamen wie Eingabe und Ausgabe! iconvscheint 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
schneidet

1
Zu Ihrer Information Diese Frage ist mit osx markiert und es sieht nicht so aus, als ob einer der Befehle zum Konvertieren auf Yosemite oder El Cap funktioniert. Die iconv-Version von Apples Ship unterstützt weder --verbose noch -o, und die andere Syntax zur Umleitung von stdout funktioniert aus irgendeinem Grund nicht und sendet sie einfach an die reguläre stdout.
Scott McIntyre

28

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
}

Durch die Konvertierung von ANSI nach UTF über Ihren ersten Vorschlag wird der gesamte Inhalt meiner Textdatei gelöscht ...
Acroneos

@Acroneos: Dann haben Sie einen Fehler gemacht: Die Eingangsdatei ist IN.txt, die Ausgangsdatei ist OUT.txt ... auf diese Weise ist es unmöglich, das Original zu überschreiben. Wenn Sie für IN.txt und OUT.txt denselben Dateinamen verwendet haben, überschreiben Sie natürlich die Datei, aus der Sie gerade lesen.
Akira

Powershell konvertiert mit BOM nach UTF. find und iconv könnten viel einfacher sein.
Paras

6

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

3

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.


Sie können anscheinend nicht in denselben Ordner konvertieren, sondern nur in einen anderen Zielordner.
Uwe Keim

Die Pro-Version ermöglicht eine direkte Konvertierung. $ 20 / 3Monate. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

Oh, die kostenlose Express-Version ist nutzlos - sie "erkennt" nur utf-8 WITH BOM !! (jeder kann tun , dass ). Nur die Pro-Version, die alle 3 Monate bei einem Preis von 20 US-Dollar automatisch erneuert wird, erkennt dies automatisch. Der Preis ist hoch für einen Nicht-Enterprise-Benutzer. UND Vorsicht, wenn Sie die Basisversion ausprobieren und Ihre Datei bereits utf-8 (ohne BOM) ist, erkennt dieser Konverter sie als ASCII und "konvertiert" sie (erneut) nach utf-8, was zu Kauderwelsch führen kann . Beachten Sie dies, bevor Sie die Express-Version testen! Sie haben eine Demoversion für den Pro, die keine Ausgabe erzeugt - sinnlos, IMHO, da die Ergebnisse vor dem Kauf nicht überprüft werden können!
SherylHohman

3

Oneliner using 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 shverwendet -exec, die einen Einzeiler mit dem -cFlag ausführt und den Dateinamen als Positionsargument "$1"mit übergibt -- {}. Dazwischen wird die utf-8Ausgabedatei temporär benannt converted.

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

Klicken Sie hier, um mehr zu finderfahren .


1

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

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





0

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ü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' -- {} \;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.