Unicode

Aus Mikiwiki
Wechseln zu: Navigation, Suche

Unicode ist ein internationaler Standard, in dem langfristig für jedes sinntragende Schriftzeichen bzw. Textelement aller bekannten Schriftkulturen und Zeichensysteme ein digitaler Code festgelegt wird. Dieser Zeichensatz enthält somit nicht nur alle europäischen Sonderzeichen, sondern auch die meisten asiatischen Zeichen. Ziel ist es, die Verwendung unterschiedlicher und inkompatibler Kodierungen in verschiedenen Ländern oder Kulturkreisen zu beseitigen.

Unicode wird laufend um Zeichen weiterer Schriftsysteme ergänzt. ISO 10646 ist die von der ISO verwendete praktisch bedeutungsgleiche Bezeichnung des Unicode-Zeichensatzes; er wird dort als Universal Multiple-Octet Character Set / UCS bezeichnet. Gemäss ISO werden pro Zeichen 32 Bit bzw. 4 Byte verwendet. Der Standard umfasst 128 Zeichengruppen mit einem jeweiligen Vorrat von 256 x 256 Zeichen.

UTF-16 (Unicode Transfer Format) stellt jedes Zeichen durch 16 Bit bzw. 2 Byte dar. Damit verdoppelt sich allerdings der Speicherbedarf und zwar auch in den Fällen, in denen nur europäische oder US-ASCII-Zeichen gespeichert werden. Ausserdem tritt der Bytecode 0 an beliebigen Stellen in Unicode-Zeichenketten auf. Viele Programme setzen aber voraus, dass das Byte 0 das Ende einer Zeichenkette markiert. Deshalb wurde als Alternative der Zeichensatz UTF-8 entwickelt, der jedes Zeichen durch 8 Bit bzw. ein Byte darstellt. Dabei werden die US-ASCII-Zeichen (7 bit) wie bisher durch ein Byte dargestellt, deren oberstes Bit 0 ist. Alle anderen Unicode-Zeichen werden durch zwei bis vier Byte lange Byte-Ketten dargestellt. Damit gibt es keinen unmittelbaren Zusammenhang mehr zwischen der Anzahl Byte und der Anzahl Zeichen einer Datei. UTF-8 ist inzwischen die meist genutzte Anwendung und wird zunehmend von Websites und Webbrowsern genutzt, um länderspezifische Zeichen abzubilden.

Da im VGA-Textmodus nur 512 verschiedene Zeichen definiert werden können, ist es eigentlich unmöglich, Unicode-Dokumente ohne Einschränkungen in Textkonsolen darzustellen. Ein Versuch ist der Zeichensatz "LatArCyrHeb-n.psfu.gz", der alle Sonderzeichen der Zeichensätze ISO-8859-1 bis ISO-8859-10 vereint.

Die Umwandlung von Dateinamen und -inhalten zwischen den Zeichensätzen Unicode und ISO 8859 kann mittels der Shell-Befehle convmv und iconv erfolgen.

Anwendung

Für Anwender, die sich nur in einer einzigen Umgebung bewegen, ist die Verwendung der Zeichenkodierung transparent, weil dann sowohl Eingabegeräte (z. B. Tastaturtreiber), verarbeitende Programme (z. B. Editoren) als auch Anzeige- und Ausgabewerkzeuge (z. B. Terminalfenster) von denselben Gegebenheiten ausgehen. Schwieriger wird es, wenn der Anwender auf zwei verschiedenen Systemen unterschiedlicher Kodierung gleichzeitig arbeitet.

Für ein Programm ist eine Zeichenkette nur eine Folge von einzelnen Byte. Eine direkte Zuordnung von einem Byte in der Zeichenkette zu einem darstellbaren Zeichen gibt es in UTF-8 nicht mehr in jedem Fall. Zwar werden die 128 Zeichen des ASCII-Code in derselben Weise dargestellt, aber bereits der Umlaut "ä" besteht aus den beiden Byte 0xC3 und 0xA4. In ISO-8859-15 reichte dazu noch das eine Byte 0xE4.

Jedes Programm muss also wissen, wie es eine Bytefolge zu interpretieren hat. Im einfachsten Fall kennt die Datei selbst ihre Kodierung. In E-Mails findet sich etwa oft ein Header mit dem sogenannten Encoding-Type. Andere Programme (z. B. Textverarbeitungen) speichern die Kodierung meist irgendwo im Dateiformat. Liegt keine Angabe der Kodierung vor, so nutzen Anwendungen den Locale-Mechanismus, der mehrere Umgebungsvariablen ausliest. Er stellt in der Standard C Library verschiedene Bibliotheksfunktionen bereit.

Der Befehl locale gibt die Umgebungsvariablen aus, die das System zur Lokalisierung verwendet. Die Variablen bestimmen neben der Zeichenkodierung auch die Sprache für Textausgaben von Programmen, Zeitformate, das Trennzeichen für Dezimalzahlen und vieles mehr.

Terminalprogramme

Der Betriebsmodus der meisten Programme richtet sich nach der Locale-Einstellung beim Programmstart. Um ein Terminalprogramm auf eine andere Kodierung umzuschalten, muss ihm diese vor dem Programmstart über die Umgebung mitgeteilt werden.

$ LANG=de_DE@UTF8 xterm &

Diese Angaben erst in der neu geöffneten Shell zu machen, hat für das Terminalprogramm selbst keine Auswirkungen, sondern nur für die in dieser Shell aufgerufenen Programme.

Bessere Terminalprogramme könne ihre Kodierung über Menüs auch zur Laufzeit ändern.

Erzeugen von Unicode-Zeichen über die Tastatur

Gemäss dem Standard ISO 14755 kann ein Unicode-Zeichen wie folgt per Tastatur erzeugt werden.

Im gnome-terminal wird SHIFT+CTRL gedrückt und gleichzeitig "u" sowie ein Codepoint eingegeben (z. B. "u2665"). Nach Loslassen der Tasten erscheint das betreffende Zeichen (z. B. erscheint für den Codepoint 2665 das Zeichen ♥).

Unter rxvt wird SHIFT+CTRL gedrückt und gleichzeitig ein Codepoint eingegeben (z. B. "2665"). Nach Loslassen der Tasten erscheint das betreffende Zeichen.

Unterschiedliche Kodierung auf zwei Systemen

Echte Probleme entstehen erst, wenn der Anwender verschiedene Systeme nutzt, auf denen unterschiedliche Kodierungsschemas laufen. Das ist häufig beim Netzwerkanmeldung über ssh der Fall. Die entfernten Programme erzeugen Zeichen in einer anderen Kodierung als das Anzeigeprogramm (das Terminal) sie erwartet, so dass anzuzeigende Texte unleserlich werden können.

In einem solchen Fall kann das entfernte System auf die Lokalisierung des Clients umgestellt werden. SSH kann beispielsweise den Inhalt der wichtigsten Umgebungsvariablen ans Zielsystem übertragen. Auf dem Client muss dazu in der Datei "/etc/ssh/ssh_config" der folgende Eintrag stehen.

SendEnv LANG LC_*

Umgekehrt sollte das Zielsystem diese Angaben mit der entsprechenden Direktive "AcceptEnv" auch annehmen. Dieser Weg funktioniert allerding snur, wenn auf dem Server die gleiche Lokalisierung wie auf dem Client aktiv ist. Zudem sollte dafür gesorgt werden, dass nicht die Startskripte der Shells (z. B. ".bashrc", ".profile" oder ".login") die Eintragungen gleich wieder zunichtemachen.

Umstieg auf Unicode

Hauptproblem bei einem Umstieg auf Unicode ist die Umwandlung bestehender Dateien, die bestimmte Zeichen in den verschiedenen Kodierungen unterschiedlich darstellen.

Suche nach allfällig umzuwandelnden Dateien.

#!/bin/bash
if [ -z $1 ]
  then
    startdir=$HOME
else
  startdir=$1
fi
find . -exec file {} \; | \
  grep 'ISO-8859 text$' | \
  sed 's/: ISO-8859 text$//' > kandidatenliste

Die Ausgabe könnte wie folgt aussehen.

/home/test/datei1: ASCII text
/home/test/datei1: ISO-8859 text
/home/test/datei1: UTF-8 Unicode text

Zur Umkodierung von Dateinamen nach UTF-8 stellen die Distributionen Debian und Ubuntu das Migrationswerkzeug utf8migrationtool zur Verfügung.

Komplexere Dateiformate wie Open Document müssen nicht umgewandelt werden, da die Kodierung in diesen Dateien bereits abgelegt ist.

Die Inhalte von Textdateien kann mit Hilfe des Befehls recode in UTF-8 umgewandelt werden.

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
country DE.gif Wikipedia ger Unicodewbm Enzyklopädischer Artikel
country US.gif Unicode Inc. eng The Unicode Consortiumwbm
country GB.gif Markus Kuhn eng UTF-8 and Unicode FAQ for Unix/Linuxwbm
country US.gif Joel Spolsky eng The absolute minimum every software developer absolutely, positively must know about Unicode and character sets : no excuses!wbm