Russisch Brot
Wer oft im Internet unterwegs ist, hat sie garantiert schon gesehen: zerst?rte Umlaute und andere kryptische Zeichen. Werkzeuge wie recode und iconv verwandeln sie ins korrekte Format zurĂĽck.
- Michael Riepe
Mit Unicode sollte alles einfacher werden: Nur noch ein Zeichensatz unterstützt alle Sprachen der Welt – inoffiziell sogar extraterrestrische wie Klingonisch. Allerdings enthält er mehr Zeichen, als man in acht Bit unterbringen kann. Vor allem für Nutzer in den westlichen Industrienationen, die zuvor ASCII oder einen der Latin-Zeichensätze (ISO 8859) verwendeten, bedeutet das eine nicht unerhebliche Umstellung.
Der Unicode-Standard respektive ISO/IEC 10646 spezifizieren mehrere Kodierungen. UCS-4, auch UTF-32 genannt, spendiert jedem Zeichen vier Byte; UCS-2 kommt mit zwei Byte aus, kann jedoch nur die Zeichen U+0000 bis U+FFFF darstellen, die sogenannte "Basic Multilingual Plane" (BMP). UTF-8 und UTF-16 können alle Zeichen in kompakter Form wiedergeben und kommen daher am häufigsten zum Einsatz. Allerdings verwenden sie Codes mit variabler Länge, die sich in Programmen schwerer handhaben lassen. Ein kleines ä etwa entspricht in UTF-8 der Bytefolge 0xc3 0xa4, während das kleine a mit einem Byte auskommt (0x61).
Nur wenige Programme können mit mehreren Zeichensätzen und Kodierungen umgehen. Einige – vor allem ältere – beherrschen gar kein Unicode, manche modernen nichts anderes. Unter Unix/Linux machen viele den verwendeten Zeichensatz von den Werten der Variablen LC_ALL, LC_CTYPE oder LANG abhängig. Zu dieser Kategorie gehört auch der X11-Terminalemulator xterm. Der Linux-Konsole kann man mit unicode_start und unicode_stop mitteilen, ob sie UTF-8 oder ASCII verwenden soll. Voreingestellt ist UTF-8, sofern man nicht beim Booten den Kernel-Parameter vt.default_utf8=0 übergibt.
Selbst wenn es dem Anwender gelingt, seinen eigenen Rechner auf einen einheitlichen Zeichensatz zu trimmen, gibt es oft Schwierigkeiten, sobald andere ins Spiel kommen. Latin-1-kodierte Kommentare eines französischen Softwareentwicklers sind selbst für Sprachkundige nicht mehr zu entziffern, wenn der verwendete Editor UTF-8 erwartet. Unter Umständen weigert sich das Programm sogar, die Datei zu öffnen.
Konvertieren tut not
Bleibt nur, sie zu konvertieren. Geht es allein um deutsche Umlaute und das Eurozeichen, lässt sich die Arbeit mit einem kurzen sed-Skript erledigen. Sobald Fremdsprachen ins Spiel kommen, empfiehlt sich der Einsatz eines mächtigeren Werkzeugs. Zu den Klassikern zählt recode. Das Programm kann mehrere Dateien in einem Arbeitsgang übersetzen und arbeitet normalerweise destruktiv: Die konvertierte Datei ersetzt das Original. Wem das zu gefährlich ist – manche Umwandlungen lassen sich nicht rückgängig machen –, der muss vorher eine Kopie anlegen.
Quell- und Zielzeichensatz erwartet das Programm als erstes Argument: recode Latin-1..UTF-8 <datei> etwa konvertiert die angegebene Datei von ISO-8859-1 nach UTF-8. Lässt man den Dateinamen weg, arbeitet recode als Filter. Kann es eine Umwandlung nicht durchführen, greift es mitunter zu einer Ersatzdarstellung: echo "42 ₠" | recode latin9..latin1 etwa ergibt 42 EUR.
Wer eine Datei in seinen lokalen Default-Zeichensatz umwandeln will, kann den Zielzeichensatz weglassen. Das Kommando recode latin1.. konsultiert zunächst die Variable DEFAULT_CHARSET. Ist sie undefiniert, bestimmen die Locale-Einstellungen in LC_ALL, LC_CTYPE oder LANG den Zielzeichensatz. Umgekehrt verwandelt recode ..utf8 Daten aus dem Default-Zeichensatz nach UTF-8, falls notwendig.
Besondere Umwandlungen
Nebenbei kann recode die Zeilenendezeichen CR (MacOS), LF (Unix) und CRLF (DOS/Windows) konvertieren. In vielen Fällen geht das automatisch: recode dos.. und recode mac.. konvertieren alte DOS- und Macintosh-Textdateien ins aktuelle Default-Format. Mit den Schlüsselwörtern tex und html kann man Umlaute und Sonderzeichen außerdem ins TeX-Format oder in HTML-Entities und zurück konvertieren. recode –l gibt eine Liste aller unterstützten Zeichensätze und Kodierungen aus. Ist ein Zeichensatz intern als Tabelle gespeichert, kann man sich mit recode –l <name> alle enthaltenen Zeichen anzeigen lassen.
Weniger mächtig, dafür jedoch Posix-standardisiert ist iconv. Es liest aus Dateien oder von der Standardeingabe und schreibt das Ergebnis auf die Standardausgabe. Quell- und Zielzeichensatz muss der Nutzer mit den Optionen –f <Quellzeichensatz> und –t <Zielzeichensatz> übergeben. Lässt er einen der beiden weg, nimmt das Programm den in den Locale-Einstellungen festgelegten Zeichensatz. Welcher das ist, verrät das Kommando locale charmap.
Im Gegensatz zu recode gibt iconv eine Fehlermeldung aus, falls es eine Transformation nicht durchführen kann, und bricht den Vorgang ab. Verwendet man die Option –c, wirft es die nicht übersetzbaren Zeichen weg und fährt mit der Übersetzung fort. Fügt man außerdem die Option –s hinzu, bleibt die Fehlermeldung aus.
Welches Werkzeug man bevorzugt, hängt vom gewünschten Ergebnis ab. Wer auf jeden Fall eine akkurate und umkehrbare Umwandlung benötigt, sollte zu iconv greifen. Programmierer können mit der Bibliothek libiconv dessen Übersetzungsfunktion direkt in ihre Software integrieren.