Open Source im professionellen Einsatz

© Terebenthine, Fotolia.com

Von ISO-8859-15 zu Unicode umsteigen

Abschrift

,

Immer mehr Linux-Systeme nutzen UTF-8 statt ISO-8859 für die Zeichenkodierung. Beim Update einer Distribution entsteht ohne Konvertierung schnell Datenmüll. Ein Migrationsleitfaden.

Eine globalisierte Welt braucht geeignete Mittel, um sich auszudrücken. Im Bereich von Zeichensätzen unterstützen mittlerweile fast alle Anwendungen die Kodierung UTF-8 von Unicode, sie muss nur aktiviert sein. Auch haben viele Distributionen ihre Default-Kodierung von der ISO-8859-Familie in UTF-8 geändert. In Fedora, Open Suse und den Ubuntu-Varianten ist UTF-8 schon länger die Voreinstellung, zuletzt hat auch Debian mit der Version 4.0 diesen Schritt gewagt.

Unicode wird zum Standard

Für Anwender, die sich nur in einer einzigen Umgebung bewegen, ist die Verwendung der Zeichenkodierung transparent, weil dann sowohl Eingabegeräte wie Tastaturtreiber, verarbeitende Programme wie Editoren als auch Anzeige- und Ausgabewerkzeuge wie Terminalfenster von den gleichen Gegebenheiten ausgehen. In diesem Fall funktioniert die Zusammenarbeit normalerweise problemlos.

Trickreicher wird es, wenn ein Anwender auf zwei Systemen unterschiedlicher Kodierung gleichzeitig arbeitet. Läuft der Admin-Desktop unter Kubuntu 7.10, der Webserver jedoch aus Stabilitätsgründen noch unter Debian 3.1, sind Schwierigkeiten programmiert. Das Terminalprogramm am Desktop erwartet in diesem Szenario vermutlich UTF-8-Zeichen, die Programme auf dem Server, auf den sich der Admin beispielsweise mit der Secure Shell einloggt, produzieren ihre Ausgaben jedoch in der Kodierung ISO-8859-15. Die Situation erinnert an die Sprachverwirrung im biblischen Babylon.

Auch wenn der Admin ein Upgrade eines ehemaligen ISO-Systems auf Unicode durchführt, beispielsweise bei der Aktualisierung auf die aktuelle Debian-Version 4.0, liegt die Tücke im Detail. Viele Benutzer haben ihre Texte in ISO-Kodierung verfasst und einige haben vielleicht Umlaute in Dateinamen verwendet. Das Übertragen solcher Dateien macht eine Konvertierung notwendig.

Für ein Programm ist ein String nur eine Folge von Einzelbytes. Eine direkte Zuordnung von einem Byte in der Zeichenkette zu einem darstellbaren Zeichen gibt es in UTF-8 nicht mehr in jedem Fall. So werden zwar die 128 Zeichen des Ascii-Code auch in UTF-8 in der gleichen Weise repräsentiert, aber bereits der Umlaut ä besteht aus den beiden Bytes 0xC3 und 0xA4. In ISO-8859-15 reichte dazu noch das eine Byte 0xE4.

Zeichendarstellung

Jedes Programm muss daher wissen, wie es eine Bytefolge zu interpretieren hat. Im einfachsten Fall kennt die Datei selbst ihre Kodierung. In E-Mail-Nachrichten findet sich beispielsweise oft ein Header mit dem so genannten Encoding-Type. Andere Programme - wie zum Beispiel Textverarbeitungen - speichern die Kodierung zumeist irgendwo im Dateiformat.

Liegt eine konkrete Angabe der Kodierung nicht vor, nutzen Anwendungen den Locale-Mechanismus, der mehrere Umgebungsvariablen ausliest. Er stellt in der Libc diverse Bibliotheksfunktionen bereit, damit nicht jedes Programm das Rad neu erfinden muss (siehe Kasten "Bibliotheksfunktionen ...").

Bibliotheksfunktionen mit
Locale-Unterstützung

Eine Reihe von Bibliotheksfunktionen unterstützt Entwickler und Anwender dabei, Anwendungen zu lokalisieren. Je nach Belegung der Umgebungsvariablen »LC_CTYPE« reagieren unter anderem die folgenden Funktionen auf die angegebene Kodierung:

  • strcoll()
  • strxfrm()
  • strftime()
  • glob()
  • regexp()
  • printf()

Das Kommando »locale« ohne Argumente gibt die Umgebungsvariablen aus, die das System zur Lokalisierung verwendet. Die Variablen definieren neben der Zeichenkodierung auch die Sprache für Textausgaben von Programmen, Zeitformate, das Trennsymbol für Dezimalzahlen, Sortierreihenfolgen und vieles mehr. Der Befehl »locale -a« zeigt die vorhanden Lokalisierungen (Englisch Locales) auf dem System an. Der Administrator legt die Locales an, bevor der Benutzer sie wählen kann. Dies geschieht auf Debian-basierten Systemen durch den Root-Benutzer mittels »dpkg-reconfigure locales«.

Dort wählt der Admin die gewünschten Locales aus, die der Paketmanager dann eventuell nachinstalliert. Unter Ubuntu kann er die Liste der unterstützten Locales der Datei »/usr/share/i18n/SUPPORTED« entnehmen und eine weitere Locale beispielsweise mit »locale-gen de_DE@euro« erzeugen.

Relevant für die Zeichenkodierung ist die Variable »LC_CTYPE«. Auf einem ISO-8859-15-System ist beispielsweise

LANG=de_AT@euro
LC_CTYPE="de_AT@euro"

eingestellt, auf einem UTF-8-System hingegen:

LANG=de_AT.utf8
LC_CTYPE="de_AT@utf8"

Der erste Teil des Wertes, hier »de« für Deutsch, gibt die Sprache an und verwendet Codes, die der ISO-639-1-Standard festlegt [2]. Der folgende Abschnitt gibt nach ISO-3166-1 das Land an, im Beispiel »AT« für Österreich [3].

Der dritte Teil definiert die Zeichenkodierung, also beispielsweise »@euro« für die europäische Erweiterung von ISO-8859-15 oder »@utf8« für die häufigste Kodierung von Unicode. Die Kodierung nach UTF-8 sorgt dafür, ein Unicode-Zeichen in eine Folge von einem bis zu vier Bytes abzubilden. Andere Kodierungen bilden die Zeichen aus Unicode in einer anderen Weise ab, beispielsweise UTF-16 immer in Paaren von zwei Bytes.

Die systemweite Voreinstellung der Lokalisierung findet üblicherweise in der Datei »/etc/environment« statt. Der Befehl »dpkg-reconfigure« erledigt den Eintrag bereits mit.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook