Unicode - eine neue Art der Zeichenkodierung

Gerd Heide

Zusammenfassung

Die Darstellung von Textzeichen im Zusammenhang mit der Computertechnik war bisher recht inhomogen. Dies gilt für alle Betriebssysteme. Um die Kodierung der Textzeichen zu vereinheitlichen, wurde der Unicode-Standard ISO-10646 entwickelt.
Mit der Umstellung der vom URZ administrierten Linux-Rechner auf Fedora Release 1.0 erfolgt erstmals ein Umstieg auf Unicode im Format UTF-8.
In den ersten 4 Abschnitten wird dem interessierten Nutzer eine Einführung in die Problematik gegeben. Die restlichen Abschnitte beschreiben, wo die Einführung von Unicode jeden einzelnen Nutzer tangieren kann, welche Probleme auftreten können und wie man sich Rat holt.

Textzeichenkodierung in Computern

Textzeichen in einer für den Menschen lesbaren Form sind für die Verarbeitung im Computer ungeeignet. Sie müssen deshalb in eine computerverständliche Form gebracht werden. Konkret heisst das, es müssen für alle Textzeichen computerverarbeitbare Äquivalente (Kodes) vereinbart sein. Das gilt sowohl für die interne Verarbeitung im Computer selbst als auch für die Speicherung auf Datenträgern wie Festplatten, Disketten, CD's usw..

Man kann den Weg eines Zeichens vereinfacht so beschreiben:

  • Eingabe:
    • über die Tastatur des Computers oder Analyse mittels Texterkennungssystem -> Erzeugen des internen Kodes
      oder
    • Lesen eines Zeichens von einem Datenträger.
  • Verarbeiten im Computer
  • Ausgabe
    • Speichern in kodierter Form auf einem Datenträger oder
    • Visualisierung durch Rückkonvertierung des internes Kodes in eine für Menschen lesbare Darstellung (z.B. für Drucker, Monitor)

Bei der Tastatureingabe kommt man durch die begrenzte Anzahl der Tasten um eine sprachabhängige Zuordnung der Tasten zu den Zeichen (genauer: ihrer internen Kodierung) nicht herum.

Die Visualisierung der internen Zeichenkodes auf Bildschirm und Drucker kann man sich vereinfacht so vorstellen, dass aufgrund des internen Kodes ein darstellbares Element aus einer Zeichensatzdatei ausgewählt wird (ggf. unter Hinzufügung von Attributen wie Grösse, Farbe, usw.).

Ein zentrales Problem stellt die Kodierung der Textzeichen dar. Leider entstanden mehrere Kodierungsvorschriften, die in unterschiedlichen Standards vereinbart sind und in den verschiedensten Systemen auch verwendet wurden und werden.

Wie wurden Texte bisher kodiert?

Wegen des geringen Leistungsvermögens ehemaliger Computer (Speicherkapazität, Rechengeschwindigkeit,...) hatte sich der Standard ISO8859 durchgesetzt:

  • Mit Ausnahme von Zeichen aus dem asiatischen Raum wurde zur Kodierung eines Zeichens immer 1 Byte benutzt. Damit sind maximal 256 verschiedene Zustände darstellbar.

   Die kleinste Einheit in einem Rechner ist das Bit, dass genau die 2 Zustände "0" oder "1" annehmen kann.
   Die kleinste adressierbare Einheit in einem Rechner ist das Byte. Es besteht aus 8 Bit.
   Da jedes Bit 2 Zustände einnehmen kann, existieren pro Byte 2*2*2*2*2*2*2*2 = 256 unterschiedliche Kombinationsmöglichkeiten.

  • Die 256 Kombinationen reichen nur zur Darstellung weniger Textzeichen. Deshalb hat man sich folgendermassen geeinigt:
    • Die Bedeutung der ersten 128 Zeichen, dem sogenannte ASCII-Zeichensatz, ist festgelegt. Dafür werden nur sieben der acht Bits eines Bytes benutzt. Das erste Bit ist immer Null. Enthalten sind alle Textzeichen des englischen Sprachraumes, u.a. das komplette lateinische Alphabet (A-Z, a-z), die Ziffern und einige Sonderzeichen wie der Unterstrich, das Fragezeichen usw.
    • Die restlichen 128 Kombinationen (mit erstem Bit = 1) sind mehrfach belegt! Die Bedeutung des Kodes kann nur in Verbindung mit der eingestellten Kodierungsvorschrift erkannt werden.

Beispiele für die unterschiedlichen Varianten des Standards ISO-8859-n:

Bitkombination ISO-8859-1
westeuropäisch
ISO-8859-5
kyrillisch
ISO8859-7
neugriechisch
ISO-8859-15
Euroland
01100001 kleines "a" kleines "a" kleines "a" kleines "a"
11100100 kleines "ä" kleines russisches "f" kleines griechisches "Delta" kleines "ä"
10100100 allg. Währungssymbol Eurozeichen unbelegt Eurozeichen

  • Der entscheidende Nachteil ist, dass zur korrekten Interpretation der Kodierungen zusätzliche Angaben (mindestens der zur Kodierung benutzte Standard) notwendig sind.
  • Zur Visualisierung müssen für jede Version des Standards Zeichensatzdateien zur Verfügung stehen, damit eine korrekte Darstellung des interen Kodes erfolgen kann
  • In reinen Textdateien können z.B. Schriften mit gleichzeitig russischen und griechischen Schriftzeichen nicht dargestellt werden.
  • Die Interpretation von Zeichenkodierungen mit erstem Bit = 1 in Dateinamen hängt ebenfalls vom eingestellten Standard ab!

Unicode - eine eindeutige Kodierungform von Zeichen

Mit den heute immens gestiegenen Speichergrössen und Verarbeitungsgeschwindigkeiten in Computern kann auf Zeichenkodierungen übergegangen werden, die nicht auf 1 Byte beschränkt sind.

Nach unabhängigen Vorarbeiten entwickeln seit 1991 zwei Gremien (Unicode-Consortium und eine Arbeitsgruppe der ISO) gemeinsam den Standard ISO-10646 für einen universellen Zeichensatz (Universal Character Set - UCS, Synonym: Unicode), der u.a. für j e d e s Zeichen in der Welt einen e i n d e u t i g e n Kode und offiziellen Namen festlegt:

  • 32 Bit = 4 Byte werden per Definition zur Kodierung eines Zeichens genutzt
  • In der Praxis reichen momentan 2 Bytes (mit mehr als 65000 Zeichen!) aus,
  • Die ASCII-Zeichen behalten ihren ursprüglichen Kodewert
  • Die restlichen in einem Byte darstellbaren Zeichen (erstes Bit = 1) entsprechen dem Standard ISO-8859-1
  • Der Zeichenbegriff versteht sich allgemein, d.h, auch mathematische und technische Symbole, Runen, Blindenschrift usw. gehören dazu.

Beispiele für Zeichenkodierungen (Kodes in 2 Bytes dargestellt):

Zeichen offizielle Bezeichnung nach ISO-10646 Bitkombination nach ISO-10646
kleines "a" LATIN SMALL LETTER A 00000000 01100001
kleines "ä" LATIN CAPITAL LETTER A WITH DIAERESIS 00000000 11100100
kleines russisches "f" CYRILLIC SMALL LETTER EF 00000100 01000100
kleines griechisches "Delta" GREEK SMALL LETTER DELTA 00000011 10110100
Eurozeichen EURO SIGN 00100000 10101100

Repräsentationsformen von Unicode

Die mit ISO-10646 festgelegte Kodierung sagt noch nicht aus, wie sie in einem Computer oder auf einem Datenträger abgebildet wird. Die einfachste Form wäre sicherlich, jedes Zeichen in 4 Byte zu kodieren. Das ist aber sehr uneffektiv, da die gebräuchlisten Zeichen unter Weglassen führender "0"-Bits in 1 oder 2 Byte darstellbar sind.

Unicode-Kodierung UTF-8

Aus Effektivitätsgründen (viele Texte bestehen aus Zeichen des ACSII-Zeichensatzes) und der Historie (viele Programme verarbeiten Texte byteweise, bestehende Textdateien sind byteorientiert) wurde als Kodierung Universal Character Set Tranformation Format 8 , kurz UTF-8 , entwickelt.

Kodierungsvorschrift von Unicode in UTF-8:

Um das Prinzip zu erkennen, werden der Übersichtlichkeit halber nur Zeichen mit 16 bit Länge betrachtet. Das Verfahren ist natürlich auf 32 Bit erweiterbar.

Unicodezeichen
von - bis
Bitfolge in UTF-8
00000000 00000000 - 00000000 01111111 0xxxxxxx
00000000 10000000 - 00000111 11111111 110xxxxx 10xxxxxx
00001000 00000000 - 11111111 11111111 1110xxxx 10xxxxxx 10xxxxxx

xxx sind die Bitpositionen des Unicodes

  • Die Zeichen des ASCII-Zeichensatzes werden in einem Byte verschlüsselt. Das erste Bit des Bytes ist "0". Damit ist das genau die ASCII-Kodierung!
  • Beginnt ein Byte mit mehr als einem "1"-Bit, so ist das der Beginn einer zusammengehörenden Bytefolge. Die Anzahl "1"-Bits entspricht der Anzahl der notwendigen Bytes für die Verschlüsselung des Unicode-Zeichens. Die nachfolgend zugehörenden Bytes beginnen alle mit "10".
  • Für maximal 16 Bit lange Unicodes werden maximal 3 Bytes benötigt
  • Für mehr als 16 Bit lange Kodes wird die Anzahl der benötigten Bytes erhöht: 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx usw.

Beispiele für die Verschlüsselung von Unicode-Zeichen in UTF-8:

Zeichen Bitkombination nach ISO-10646 Darstellung in UTF-8-Kodierung
kleines "a" 00000000 01100001 01100001
kleines "ä" 00000000 11100100 11000011 10100100
kleines russisches "f" 00000100 01000100 11010001 10000100
kleines griechisches "Delta" 00000011 10110100 11001110 10110100
Eurozeichen 00100000 10101100 11100010 10000010 10101100

Kodierung mittels UTF-8 wird in Linux-/Unix-Systemen eingesetzt.

Unicode-Kodierung UTF-16

UTF-16 benutzt als kleinste Einheit 16 Bit. Damit können viele Zeichen aus dem Unicodestandard direkt abgebildet werden. Beanspruchen Textzeichen mehr als 16 Bits, werden dafür Kombinationen aus 2x2 Bytes genutzt.

"Die meisten Windows-Oberflächen verwenden UTF-16" (lt. Hilfe- und Supportcenter von Microsoft). UTF-16 wird auch in Java genutzt.

Unicode-Kodierung UTF-32

Die Repräsentation von Unicode in 32 Bit ist definiert, aber ein Anwendungsfall ist zumindest dem Autor noch nicht bekannt.

Was bedeutet der Wechsel auf Unicode?

Die Einführung von Unicode nach ISO-10646 ist in der Computerwelt höchst sinnvoll und längst überfällig. Immerhin werden die unterschiedlichen sprachspezifischen Erweiterungen des ISO8859-Standards und andere Zeichenstandards durch einen einzigen allumfassenden ersetzt.

Die Umstellung auf eine neue Kodierung erfordert von Betriebssystementwicklern, Anwendungsprogrammprogrammierern und Systemadministratoren grosse Anstrengungen, besonders, um auch die Nutzung von (älteren) in anderer Kodierung gespeicherten Texten zu gewährleisten. Obwohl innerhalb des neuen Systems die Behandlung von Textzeichen problemlos verlaufen sollte, können objektiv nicht alle Fälle behandelt werden.

Betroffen von der neuen Kodierung sind alle die Stellen, wo im Rechner auf Zeichen(ketten) zurückgegriffen wird:

  • Textdateien (Beschreibungen in einem Textformat, Sourcecode, Scripts, HTML-Files, Emails, ...)
  • Dateinamen
  • Standardinput, -output, -error, Pipes
  • Environmentvariable
  • Cut&Paste-Buffer
  • Remote-Zugriff auf anderere Rechner: Telnet, ssh, Modem, Serial-Port-Verbindungen zu Terminalemulatoren

wobei für die gewöhnliche Nutzung besonders die ersten beiden Anstriche von Bedeutung sind.

Kritische Arbeitsweisen entstehen durch die Historie und das Nebeneinanderbestehen alter und neuer Systeme:

  • wenn im neuen System weiterhin auf alte Dateien zurückgegriffen wird
  • wenn weiterhin in einem alten und neuen System mit den gleichen Daten gearbeitet wird
    • das alte System erkennt die neue Kodierung nicht oder der zur Visualisierung nötige Zeichensatz ist nicht vorhanden
    • das neue System kann die alten Daten nicht ordentlich verarbeiten

Daneben existieren die bisher schon bekannten Probleme der gemeinsamen Nutzung von Daten in mehreren Betriebssystemplattformen.

Textdateien

Was funktioniert und was nicht, hängt von der Intelligenz der Programme ab, die mit den Daten umgehen:

  • Es gibt (hoffentlich) viele Programme, die die Kodierung der Textdateien (ISO8859-x, UTF-8, UTF-16, ...) erkennen und dann entsprechend handeln
  • Bestimmte Programme lassen sich die Kodierung durch Umgebungsvariable vorgeben
  • Der problematischste Fall ist, dass eine Applikation eine feste Annahme über die zu verarbeitenden Daten trifft.

Für die Umstellung des Inhalts von Textdateien in ein anderes Format (und ggf. auch zurück) gibt es Konvertierungswerkzeuge, z.B. unter Linux das Programm iconv:


[ghe@springer ghe]$ iconv --list
Die folgende Liste enthält alle bekannten Zeichensatzkodierungen.  Das
bedeutet nicht, dass zwischen allen Kombinationen dieser Namen als FROM
und TO Parameter konvertiert werden kann.  Eine Zeichensatzkodierung kann
unter verschiedenen Namen aufgeführt sein (sog. Aliasnamen).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865,
  866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4,
  ...
  UNICODE, UNICODEBIG, UNICODELITTLE, US-ASCII, US, UTF-7, UTF-8, UTF-16,
  UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF7, UTF8, UTF16, UTF16BE,
  UTF16LE, UTF32, UTF32BE, UTF32LE, VISCII, WCHAR_T, WIN-SAMI-2, WINBALTRIM,
  WINDOWS-31J, WINDOWS-936, WINDOWS-1250, WINDOWS-1251, WINDOWS-1252,
  WINDOWS-1253, WINDOWS-1254, WINDOWS-1255, WINDOWS-1256, WINDOWS-1257,
  WINDOWS-1258, WINSAMI2, WS2, YU

Dateinamen

Die Konflikte werden am Beispiel Linux beschrieben. Ein Vorteil ist, dass in Linux-/Unix-Systemen der Unicode in UTF-8-Kodierung benutzt wird und so alle ASCII-Zeichen die gleiche Kodierung von 1 Byte Länge besitzen wie bisher in ISO-8859-x!

Innerhalb von Dateinamen führen Nicht-ASCII-Zeichen in der alten ISO88859-Kodierung unweigerlich zu falschen Darstellungen im einem System mit UTF-8-Zeichenkodierung und umgekehrt.

Beispiel:

Es existieren die Dateinamen:

  • ä-utf8 in UTF-8-Kodierung (interne Bitfolge: 11000011 10100100 00101101 01110101 01110100 01100110 00111000)
  • ä-iso in ISO-8859-1-Kodierung (interne Bitfolge: 11100100 00101101 01101001 01110011 01101111)

konqueror_utf8.jpg

Falsche Anzeige von ISO-8859-Zeichen unter UTF-8:

11100100 00101101 01101001 01110011 01101111
                      i       s        o

  - "11100100" zeigt 3 Bytes zur Darstellung des Zeichens an 
     ^^^
  - Die "0" am Anfang des nächsten Bytes bedeutet "Fehler" (Es müsste mit "10" beginnen)
-> Anzeige eines kleinen Quadrates als Kennzeichen für ein nichtdarstellbares Zeichen - Die restlichen Bytes entsprechen ASCII-Zeichen und werden korrekt dargestellt ("iso")

konqueror_iso.jpg

Falsche Anzeige von UTF-8-Zeichen unter ISO-8859-1:

11000011 10100100 00101101 01110101 01110100 01100110 00111000

   Ä        €        -        u        t        f         8


   - Jedes Byte wird einzeln als Zeichen interpretiert!

In diesem Fall wird man um kaum umhinkommmen, eine eigenständige Umbenennung der Dateinamen mittels eines Dateimanagers vorzunehmen.

Es sollte der alte, aber immer wieder in Vergessenheit geratene Ratschlag befolgt werden, in Dateinamen nur Gross- und Kleinbuchstaben (A-Z. a-z), Ziffern (0-9) und den Unterstrich zu verwenden! Selbst andere ASCII-Zeichen (?, *, ...) sind ungeeignet , da sie in oftmals eine Sonderbedeutung besitzen.

Wo hole ich mir Rat bei Problemen?

  • Hinweise und Problemlösungen bezüglich Unicode auf den vom URZ administrierten Rechnern sind in einer speziellen URZ-Unicode-FAQ-Liste zusammengestellt.
  • Wenn in der URZ-Unicode-FAQ-Liste das Problem noch nicht aufgenommen ist, dann bitte eine Mail an hilfe@hrz.tu-chemnitz.de mit dem Vermerk "UNICODE: problemkürzel " schicken.

Weitere Informationsquellen:

Impressum - Copyright © 2003-2008 by TU Chemnitz, URZ, alle Rechte vorbehalten.