iX 1/2017
S. 134
Praxis
Tipps und Tricks
Aufmacherbild

Textcodierungen ändern und wandeln

Kein ü für ein ü vormachen

Dank Unicode kann man heute zwar auf jeder Plattform nahezu beliebige Zeichen darstellen. Aber der Alltag konfrontiert Anwender immer wieder mit kryptischen Erscheinungen wie ü. Kleine Werkzeuge und Editor-Funktionen helfen in diesen Fällen.

Der Siegeszug von Unicode hat Entwicklern und Nutzern das Leben erleichtert: Für nahezu jedes auf der Welt verwendete Zeichen (und für Klingonisch) definiert der Standard eine vier Byte große Zahl, den Code-Point. Unicode-Texte können deshalb alle möglichen Sprachen und Sonderzeichen enthalten, ohne dass sie Umschaltsequenzen oder ähnliche Tricks benötigen. Durch geschickte Codierungen wie UTF-8 braucht man zudem für die alten ASCII-Zeichen weiterhin nur ein Byte und für die des westeuropäischen Latin-1 maximal zwei.

Allerdings ist Daten in der Regel nicht anzusehen, was sie codieren. Und beim Darstellen von Texten spielen viele Komponenten mit, die sich nicht immer über die Codierung einig sind. Konvertierungsversuche von UTF-8 zu einer 8-Bit-Codierung können schiefgehen, etwa weil es das Zeichen dort nicht gibt. Lästige Beispiele dafür sind Anführungszeichen unten, Gedankenstriche und Ellipsen (…). Aktuelle Software fügt sie teilweise automatisch ein, ohne dass das dem Anwender bewusst ist.

Notorisch problematisch ist das Anhängen von Textdateien an E-Mails. Programme wie Apples Mail und Thunderbird vermuten in diesem Fall irgendeine „passende“ Codierung und schreiben die in den MIME-Header für das Attachment. Beim Empfänger erscheinen dann in einer UTF-8-Datei eigenartige Zeichenkombinationen, weil sein Mail- oder Anzeigeprogramm sie, dem Header-Eintrag vertrauend, für Latin-1-codiert hält. Im umgekehrten Fall fehlen Zeichen oder sind durch leere Kästchen ersetzt.

Dateien selbst korrigieren

Unter Unix ist iconv das Standardwerkzeug zum Konvertieren von Dateien (siehe iX-Links). Da es von der Standardeingabe liest und auf die Standardausgabe schreibt, erzeugt man damit in der Regel eine konvertierte Kopie des Originals. Das ist oft sinnvoll, weil es Datenverlust vermeidet. Das Tool kommt mit einer großen Zahl von Codierungen zurecht, dazu gehören neben den üblichen Latin-Varianten das ältere Mac-Roman und diverse Windows-spezifische Versionen. Trifft es beim Wandeln auf ein Zeichen, das in der Zielcodierung nicht existiert, gibt es eine äußerst knappe Fehlermeldung mit Zeilen- und Zeichennummer aus. Mit dem Schalter c lässt sich das vermeiden, die Ausgabe ist dann jedoch unvollständig. Alternativ kann man an die Zielcodierung //translit anhängen, was für einige Zeichen alternative Darstellungen einsetzt.

Wer Texte auch bearbeiten will, kann gleich zu einem Editor greifen. Emacs und vi(m) können beim Öffnen oder Schreiben einer Datei deren Inhalt umcodieren. Wer etwa im Emacs eine Datei öffnet und dann etwas wie „größte“ sieht, kann mit Ctrl-X Return R utf-8 das Kommando revert-buffer-with-coding-system auslösen. Es liest die Datei erneut und betrachtet sie dabei als UTF-8-codiert. Im vi erledigt dies der Befehl :e ++enc=utf-8. Im Ziel-Encoding nicht darstellbare Zeichen führen zu Fehlermeldungen und zu Handarbeit, etwa um einen Gedankenstrich durch den kürzeren Bindestrich zu ersetzen.

Ähnlich lässt sich der Text in einer anderen Codierung speichern. Im Emacs mit Ctrl-X Return F <encoding> (set-buffer-file-coding-system), im vi mit

:write ++enc=<encoding> <dateiname>

Relativ einfach können Anwender defekte Zeichencodierungen auf Webseiten „korrigieren“ – wenn auch nicht dauerhaft. Dafür reicht es, im Browser unter „Ansicht“ oder „Anzeige“ die Codierung richtig zu setzen. Langfristig muss jedoch der Betreiber der Website sicherstellen, dass er seine Seiten mit dem richtigen Wert ausliefert. Dazu dient zum einen ein meta-Element im HTML-Kopf, etwa:

<meta charset="utf-8"/>

Außerdem sollte der vom Webserver gesendete HTTP-Header Content-Type die richtige Codierung enthalten. Das erledigt ein Eintrag in der Konfigurationsdatei, beim Apache zum Beispiel AddDefaultCharset UTF-8.

Schwierig ist es, „doppelte“ UTF-8-Codierungen zu korrigieren. Sie entstehen, wenn UTF-8-Daten fälschlich als 8-Bit-Werte betrachtet und erneut in UTF-8 gewandelt werden. Das Ergebnis kann dann etwa so aussehen: Ã,®. Das Phänomen tritt häufig im Zusammenhang mit Datenbanken auf, etwa wenn zwischen MySQL, PHP und dem Browser keine Einigkeit über die Codierung herrscht. Im günstigsten Fall reicht es, eine passende Option für MySQL zu setzen. Wesentlich schlechter steht da, wer auf diese Weise schon fehlerhaft codierte Daten gespeichert hat. Da hilft womöglich nur ein Dump mit anschließendem Konvertieren und erneutem Laden in die Datenbank. (ka)