Bash-Script: Encoding/Zeichensatz in UTF-8 ändern

Ein Relikt aus alten Zeiten ist, dass man anstatt UTF-8 einen platzsparenden Zeichensatz wie ISO-8859-15 aka Latin1 eingesetzt hat. Heute ist oftmals UTF-8 die Anforderung, so dass man die Dateien nach UTF-8 konvertieren muss.

Das Problem ist, dass die Dateien oftmals unterschiedliche Zeichensätze besitzen. Siehe in folgendem Beispiel ISO-8859 text und Non-ISO extended-ASCII text:

# for file in *.html ; do file $file; done

2003April.html: HTML document, ISO-8859 text, with very long lines
2003August.html: HTML document, ISO-8859 text, with very long lines
2003Juli.html: HTML document, ISO-8859 text, with very long lines
2003Juni.html: HTML document, ISO-8859 text, with very long lines
2003Maerz.html: HTML document, Non-ISO extended-ASCII text, with very long lines

Das oftmals vorgeschlagene Linux Tool iconv hat hiermit Probleme, da man explizit den Ausgangszeichensatz angeben muss. Stimmt dieser nicht überein, gibt es folgende Fehler:

# for file in *.html; do iconv -t ISO-8859-15 -t UTF-8 $file -o $file; done; iconv: illegal input sequence at position 278
iconv: illegal input sequence at position 287
iconv: illegal input sequence at position 279
iconv: illegal input sequence at position 269
iconv: illegal input sequence at position 269
iconv: illegal input sequence at position 276
iconv: illegal input sequence at position 288
iconv: illegal input sequence at position 290

Eine bessere alternative ist vim, da hier nur das Zielformat angegeben werden muss. Der Trick ist, dass man vim in den "Bash-Modus" versetzen muss:

for file in *.html; do vim +"set nobomb | set fenc=utf8 | x" $file ; done;
  • +: Vim führt beim Öffnen automatisch Befehle aus.
  • |: Trenner, um mehrere Befehle auszuführen.
  • set nobomb: Wir wollen kein UTF-8 BOM
  • set fenc=utf8: Ziel Encoding ist UTF-8
  • x: Speichern und Schließen