Zeichensatzkonvertierung
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Im folgenden findet man Skripte bzw. Einzeiler in verschiedenen Programmiersprachen, um den Zeichensatz einer Datei zu ändern.
Die Dateien für die Skripte müssen gegebenfalls mit einem Editor[2] erstellt und dann ausführbar[3] gemacht werden.
Bash¶
In der Shell kann man dafür den Befehl iconv benutzen. Die iconv-Routinen werden mit dem Paket libc6 installiert, sollten also auf allen Linux-Systemen vorhanden sein.
Die Parameter -f
(= "from") und -t
(= "to") geben die Start- und Zielkodierung an.
Normalerweise wird der konvertierte Text auf die Standardausgabe geschrieben. Zur Ausgabe in eine Datei setzt man die Option -o
(= "output").
iconv -f ISO-8859-15 -t UTF-8 -o utf8datei.txt isodatei.txt
Eine Liste der auf dem System bekannten Kodierungen erhält man mit dem Befehl
iconv -l
Der Befehl recode arbeitet ähnlich und ist nützlich, wenn man das konvertierte Ergebnis wieder in der ursprünglichen Datei speichern will.
Wenn man das Encoding nicht kennt, aber weiß, dass ein bestimmtes Wort im Text vorkommt, dann kann man mit dem encoding-finder nach möglichen Encodings suchen - meist liefert das Script mehrere Kandidaten.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash # # encoding-finder.sh # (C) GPLv3, Stefan Wagner 2007 # # In einer Datei einen bekannten (Teil-)String (z.B.: Begrüßung) suchen, # indem alle Encodings ausprobiert werden. # [[ $# -ne 2 ]] && echo "Usage: encoding-finder.sh FILE PATTERN_WITH_UMLAUT_FOR_SURE_IN_FILE" && exit FILE=$1 PATTERN=$2 for enc in $( iconv -l | sed 's/..$//') do iconv -f $enc -t UTF-8 $FILE 2>/dev/null | grep $PATTERN && echo $enc done |
Ruby¶
Ruby stellt eine Wrapperklasse zur Verfügung.
Zu beachten ist, dass die Konvertierungsroutine noch einmal mit nil
als Parameter aufgerufen werden muss, da noch Zeichen im Puffer zurückgeblieben sein können.
1 2 3 4 5 6 7 8 | require 'iconv' k = Iconv.new("UTF-8", "ISO-8859-15") utf8string = k.iconv(isostring) utf8string << k.iconv(nil) k.close |
Python¶
Bei Python 2.x hat jeder String eine "decode" Methode. Mit dieser kann man den String umwandeln, im folgenden Beispiel von Latin-1 nach UTF-8
1 | "Hier ist der umzuwandelnde Sting".decode("latin1").encode("utf-8") |
Perl¶
In Perl gibt es z.B. das Encode::Encoder Modul.
1 2 3 4 5 6 7 8 9 | #!/usr/bin/perl -w use strict; use Encode::Encoder qw(encoder); my $string = "Hello Wörld!"; print encoder($string)->iso_8859_1, "\n"; print encoder($string)->utf8->latin1, "\n"; #hin und zurück |