Der beste Weg, um Textdateien zwischen Zeichensätzen zu konvertieren?

526

Was ist das schnellste und einfachste Tool oder die schnellste Methode zum Konvertieren von Textdateien zwischen Zeichensätzen?

Insbesondere muss ich von UTF-8 nach ISO-8859-15 konvertieren und umgekehrt.

Alles ist möglich: Einzeiler in Ihrer bevorzugten Skriptsprache, Befehlszeilentools oder andere Dienstprogramme für Betriebssysteme, Websites usw.

Beste Lösungen bisher:

Unter Linux / UNIX / OS X / cygwin:

  • Das von Troels Arvin vorgeschlagene Gnu- Symbol wird am besten als Filter verwendet . Es scheint universell verfügbar zu sein. Beispiel:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    Wie Ben betont hat , gibt es einen Online-Konverter, der iconv verwendet .

  • Die von Cheekysoft vorgeschlagene Gnu- Neukodierung ( manuell ) konvertiert eine oder mehrere Dateien direkt . Beispiel:

    $ recode UTF8..ISO-8859-15 in.txt
    

    Dieser verwendet kürzere Aliase:

    $ recode utf8..l9 in.txt
    

    Recode unterstützt auch Oberflächen, mit denen zwischen verschiedenen Zeilenendtypen und Codierungen konvertiert werden kann:

    Konvertieren Sie Zeilenumbrüche von LF (Unix) in CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    Base64-Codierungsdatei:

    $ recode ../Base64 in.txt
    

    Sie können sie auch kombinieren.

    Konvertieren Sie eine Base64-codierte UTF8-Datei mit Unix-Zeilenenden in eine Base64-codierte Latin 1-Datei mit Dos-Zeilenenden:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

Unter Windows mit Powershell ( Jay Bazuzi ):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (Keine ISO-8859-15-Unterstützung. Unterstützte Zeichensätze sind Unicode, utf7, utf8, utf32, ascii, bigendianunicode, default und oem.)

Bearbeiten

Meinen Sie die Unterstützung von ISO-8859-1? Die Verwendung von "String" bewirkt dies zB umgekehrt

gc -en string in.txt | Out-File -en utf8 out.txt

Hinweis: Die möglichen Aufzählungswerte sind "Unbekannt, Zeichenfolge, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii".

Antti Sykäri
quelle
Ich habe es versucht, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlaber es konvertiert die Datei in utf-8, aber dann ist es leer! Notepad ++ sagt, dass die Datei im Ansi-Format ist, aber nach meinem Verständnis ist das nicht einmal ein gültiger Zeichensatz? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
2
Finden Sie einfach eine Antwort auf eine verwandte Frage - eine großartige Zusammenfassung! Ich dachte nur, es lohnt sich hinzuzufügen, recodedas auch als Filter fungiert, wenn Sie keine Dateinamen übergeben, z. B.:recode utf8..l9 < in.txt > out.txt
Jez
iconv.com/iconv.htm scheint für mich tot zu sein? (Auszeit)
Andrew Newby
2
Wenn Sie verwenden enca, müssen Sie die Eingabecodierung nicht angeben. Es reicht oft aus, nur die Sprache anzugeben : enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev
1
Tatsächlich funktionierte iconv als In-Place-Konverter viel besser als als Filter. Beim Konvertieren einer Datei mit mehr als 2 Millionen Zeilen werden iconv -f UTF-32 -t UTF-8 input.csv > output.csvnur etwa siebenhunderttausend Zeilen gespeichert, nur ein Drittel. Mit der In-Place-Version wurden iconv -f UTF-32 -t UTF-8 file.csvalle mehr als 2 Millionen Zeilen erfolgreich konvertiert.
Nicolay77

Antworten:

246

Eigenständiger Utility- Ansatz

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

Sie müssen keines dieser Argumente angeben. Sie verwenden standardmäßig Ihr aktuelles Gebietsschema, normalerweise UTF-8.

Troels Arvin
quelle
4
Für alle anderen, die von den nicht verfügbaren Dash-Versionen gestolpert werden, sieht es so aus, als würden OSX-Versionen (und möglicherweise alle BSD-Versionen) von iconv die Nicht-Dash-Aliase für die verschiedenen UTF- * -Codierungen nicht unterstützen. iconv -l | grep UTFHier erfahren Sie, welche UTF-bezogenen Codierungen Ihre Kopie von iconv unterstützt.
Coredumperror
14
Sie kennen die Kodierung Ihrer Eingabedatei nicht? Verwenden Sie chardet in.txtdiese Option , um eine bestmögliche Vermutung zu erstellen. Das Ergebnis kann als ENCODING in verwendet werden iconv -f ENCODING.
Eintopf
4
Verhindern Sie das Beenden bei ungültigen Zeichen (Vermeiden von illegal input sequence at positionNachrichten) und ersetzen Sie "seltsame" Zeichen durch "ähnliche" Zeichen : iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
Knb
Ich mag das, weil es auf den meisten NIX-Plattformen Standard ist. Sieht aber auch die VIM Befehlsoption (alias: ex) unten . Zusätzliche Informationen: (1) Sie müssen (wahrscheinlich) die -fOption (von) nicht mit angeben iconv. (2) Der file --mime-encoding <file/s>Befehl kann Ihnen helfen, die Codierung überhaupt herauszufinden.
13.
1
FWIW der fileBefehl meldete meine Quelle als UTF-16 Little Endian; Laufen iconv -f UTF-16 -t UTF-8...es falsch in ASCII transformiert, musste ich explizit angeben, iconv -f UTF-16LE...um UTF-8
Plato
90

Versuchen Sie es mit VIM

Wenn Sie haben vim, können Sie dies verwenden:

Nicht für jede Codierung getestet.

Das Coole daran ist, dass Sie die Quellcodierung nicht kennen müssen

vim +"set nobomb | set fenc=utf8 | x" filename.txt

Beachten Sie, dass dieser Befehl die Datei direkt ändert


Erklärungsteil!

  1. +: Wird von vim verwendet, um beim Öffnen einer Datei den Befehl direkt einzugeben. Wird normalerweise zum Öffnen einer Datei in einer bestimmten Zeile verwendet:vim +14 file.txt
  2. |: Trennzeichen für mehrere Befehle (wie ;in Bash)
  3. set nobomb : keine utf-8 Stückliste
  4. set fenc=utf8: Setzen Sie die neue Codierung auf utf-8 doc link
  5. x : Datei speichern und schließen
  6. filename.txt : Pfad zur Datei
  7. ": qotes sind hier wegen rohren. (Andernfalls werden sie von bash als Bash-Pipe verwendet.)
Boop
quelle
Ziemlich cool, aber etwas langsam. Gibt es eine Möglichkeit, dies zu ändern, um mehrere Dateien gleichzeitig zu konvertieren (wodurch die Initialisierungskosten von vim gespart werden)?
DomQ
Danke für die Erklärung! Ich hatte Schwierigkeiten mit dem Beginn der Datei, bis ich mich über die Bomben- / Nobomb-Einstellung informiert hatte.
JJWDesign
1
np, zusätzlich können Sie die Bom anzeigen, wenn Sie vim -boderhead file.txt|cat -e
Boop
1
Zum Beispiel:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel
Ich habe dies verwendet, um die Codierung von CSV-Dateien zu konvertieren, und war sehr aufgeregt, als ich sah, dass sich der Zeichensatz tatsächlich geändert hatte. Als ich die Datei in MySQL lud, hatte sie leider eine andere Anzahl von Spalten als zuvor, bevor der Befehl vim ausgeführt wurde. Frage mich, ob es möglich wäre, die Datei einfach zu öffnen, die Codierung zu konvertieren und die Datei zu speichern / zu schließen, während alle anderen Dateiinhalte gleich bleiben?
NightOwlPrgmr
39

Unter Linux können Sie mit dem sehr leistungsstarken Befehl recode versuchen, zwischen den verschiedenen Zeichensätzen und allen Problemen mit dem Zeilenende zu konvertieren. recode -l zeigt Ihnen alle Formate und Codierungen an, zwischen denen das Tool konvertieren kann. Es ist wahrscheinlich eine sehr lange Liste.

Cheekysoft
quelle
Wie konvertieren Sie zu LF? Es gibt /CRund /CR-LFaber nein/LF
Aaron Franke
21

iconv (1)

iconv -f FROM-ENCODING -t TO-ENCODING file.txt

Es gibt auch iconv-basierte Tools in vielen Sprachen.

Daniel Papasian
quelle
1
Was ist mit der automatischen Erkennung der ursprünglichen Codierung?
Aaron Franke
20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

Die kürzeste Version, wenn Sie davon ausgehen können, dass die Eingabestückliste korrekt ist:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt
Jay Bazuzi
quelle
1
Hier ist eine kürzere Version, die besser funktioniert. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle
@ LarryBattle: Wie funktioniert es Set-Contentbesser als Out-File?
Jay Bazuzi
...Oh. Ich denke, sie sind fast dasselbe. Ich hatte Probleme beim Ausführen Ihres Beispiels, da ich davon ausging, dass beide Versionen dieselbe file-utf8.txtDatei für die Eingabe verwendeten, da beide dieselbe Ausgabedatei hatten wie file-utf7.txt.
Larry Battle
Das wäre wirklich großartig, außer dass UTF16 nicht unterstützt wird. Es unterstützt UTF32, aber nicht UTF16! Ich würde keine Dateien konvertieren müssen, außer dass viele Microsoft-Software (z. B. SQL Server bcp) auf UTF16 besteht - und dann wird ihr Dienstprogramm nicht in UTF16 konvertiert. Interessant, um es gelinde auszudrücken.
Noah
Ich habe es versucht, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlaber es konvertiert die Datei in utf-8, aber dann ist es leer! Notepad ++ sagt, dass die Datei im Ansi-Format ist, aber nach meinem Verständnis ist das nicht einmal ein gültiger Zeichensatz? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
16

Probieren Sie die iconv Bash-Funktion aus

Ich habe dies in .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

.. um Dateien wie folgt konvertieren zu können:

utf8 MyClass.java
Arne Evertsson
quelle
8
Es ist besser, tmp = $ (mktmp) zu verwenden, um eine temporäre Datei zu erstellen. Auch die Leitung mit rm ist redundant.
LMZ
1
Können Sie diese Funktion mit dem Eingabeformular für die automatische Erkennung ausführen?
mlibre
3
Vorsicht, diese Funktion löscht die Eingabedatei, ohne zu überprüfen, ob der Aufruf von iconv erfolgreich war.
Philwalk
Dies ändert den Inhalt der Textdatei. Ich habe dies auf einem UTF-8 mit Stückliste ausgeführt und erwartet, dass ein UTF-8 ohne Stücklistendatei herauskommt, aber es wurde am Anfang der Datei vorangestellt .
Aaron Franke
14

Versuchen Sie Notepad ++

Unter Windows konnte ich Notepad ++ verwenden, um die Konvertierung von ISO-8859-1 nach UTF-8 durchzuführen . Klicken Sie auf "Encoding"und dann "Convert to UTF-8".

Jeremy Glover
quelle
13

Oneliner mit find mit automatischer Zeichensatzerkennung

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

Wobei file -bibedeutet:

  • -b, --brief Stellen Sie den Dateinamen keine Dateinamen voran (Kurzmodus).

  • -i, --mime Bewirkt, dass der Befehl file anstelle von herkömmlichen Zeichenfolgen vom Typ MIME Zeichenfolgen vom Typ MIME ausgibt. So kann es zum Beispiel text/plain; charset=us-asciieher sagen als ASCII text. Der sedBefehl schneidet dies nur so ab, us-asciiwie es von erforderlich ist iconv.

Der findBefehl ist für eine solche Dateiverwaltungsautomatisierung sehr nützlich. Klicken Sie hier für mehr in findHülle und Fülle .

Serge Stroobandt
quelle
3
Ich musste diese Lösung ein wenig anpassen, um unter Mac OS X zu arbeiten, zumindest in meiner Version. find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller
1
Ihr Code funktionierte auch unter Windows 7 mit MinGW-w64 (neueste Version). Danke, dass du es geteilt hast!
Silvioprog
@rmuller Der sedBefehl ist absichtlich vorhanden und ermöglicht die automatische Erkennung der Zeichenkodierung. Ich habe die Antwort erweitert, um dies jetzt zu erklären. In Bezug auf die Leserschaft wäre es höflich, alle verbleibenden irrelevanten Kommentare zu löschen. Vielen Dank.
Serge Stroobandt
@ SergeStroobandt Vielleicht war ich nicht klar genug. Mein Punkt ist, wenn Sie "file -b --mime-encoding" anstelle von "file -bi" verwenden, besteht keine Notwendigkeit, das Ergebnis mit sed zu filtern. Dieser Befehl gibt bereits nur die Dateicodierung zurück. Also in Ihrem Beispiel "us-ascii"
rmuller
Dies scheint unter Linux eigentlich nichts für mich zu tun. Ich habe eine Datei als UTF-8 mit Stückliste gespeichert und erwartet, dass sie ohne Stückliste in UTF-8 konvertiert wird, was jedoch nicht der Fall war.
Aaron Franke
3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);

user15096
quelle
1
Diese Anweisung eignet sich hervorragend zum Konvertieren von Zeichenfolgen, jedoch nicht für Dateien.
JJWDesign
2

DOS / Windows: Codepage verwenden

chcp 65001>NUL
type ascii.txt > unicode.txt

Mit dem Befehl chcpkann die Codepage geändert werden. Die Codepage 65001 ist der Microsoft-Name für UTF-8. Nach dem Einstellen der Codepage wird für die Ausgabe, die durch die folgenden Befehle generiert wird, die Codepage festgelegt.

Lalthome
quelle
1

Um normalerweise eine Eigenschaftendatei (Java) zu schreiben, verwende ich diese unter Linux (Mint- und Ubuntu-Distributionen):

$ native2ascii filename.properties

Zum Beispiel:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS: Ich habe die Hinrichtung Nummer eins / zwei in Portugal geschrieben, um Sonderzeichen zu erzwingen.

In meinem Fall habe ich bei der ersten Ausführung folgende Nachricht erhalten:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

Als ich die erste Option (gcj-5-jdk) installiert habe, war das Problem behoben.

Ich hoffe das hilft jemandem.

Maciel Bombonato
quelle
0

Mein Lieblingswerkzeug dafür ist Jedit (ein Java-basierter Texteditor), der zwei sehr praktische Funktionen hat:

  • Eine, die es dem Benutzer ermöglicht, einen Text mit einer anderen Codierung neu zu laden (und als solche das Ergebnis visuell zu steuern).
  • Eine andere, mit der der Benutzer die Codierung (und das Zeilenendezeichen) vor dem Speichern explizit auswählen kann
Yota
quelle
0

Ändern Sie einfach die Codierung der geladenen Datei in der IntelliJ IDEA IDE rechts in der Statusleiste (unten), wo der aktuelle Zeichensatz angezeigt wird. Es wird aufgefordert, neu zu laden oder zu konvertieren und Konvertieren zu verwenden. Stellen Sie sicher, dass Sie die Originaldatei im Voraus gesichert haben.

Nikolai Varankine
quelle
0

Wenn MacOS-GUI-Anwendungen Ihr Brot und Butter sind, ist SubEthaEdit der Texteditor, den ich normalerweise zum Codieren-Wrangling verwende. Mit der "Konvertierungsvorschau" können Sie alle ungültigen Zeichen in der Ausgabecodierung anzeigen und korrigieren / entfernen.

Und es ist jetzt Open Source , also yay für sie 😉.

tiennou
quelle