Die Darstellung von Textzeichen im Zusammenhang mit der Computertechnik war bisher in allen Betriebssystemen recht inhomogen. 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 Core 1.0 erfolgt erstmals ein Umstieg auf Unicode im Format UTF-8. Der Artikel beschreibt Vorteile von Unicode, eventuelle Probleme beim Umstieg und Hintergrundinformationen für den interessierten Leser.
Die Einführung von Unicode nach ISO-10646 ist in der Computerwelt höchst sinnvoll und längst überfällig. Die bisherigen Kodierungen, d.h., wie die Zeichen zur Verarbeitung computergerecht aufbereitet wurden, waren nicht eineindeutig. Mit Unicode werden nun die unterschiedlichen sprachspezifischen Erweiterungen des bisher meist genutzten ISO8859-Standards und anderer Zeichenstandards durch einen einzigen, allumfassenden Standard ersetzt. Jedes in der Welt vorkommende Zeichen besitzt ein eindeutiges Äquivalent in der Kodierungsvorschrift!
Im Betriebssystem Fedora Core 1 wurde erstmals auf Unicode ISO-10646 im UTF-8-Format umgestellt. Näheres siehe unten.
Das bedeutet eine gewisse Vorreiterrolle. Anderere Distributionen wie z.B. SuSE-Linux werden im nächsten Release ebenfalls umsteigen.
Die Umstellung auf eine neue Kodierung erfordert von Betriebssystementwicklern, Anwendungsprogrammierern und Systemadministratoren große 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, E-Mails, ...)
- Dateinamen
- Standardinput, -output, -error, Pipes
- Environmentvariable
- Cut&Paste-Buffer
- Remote-Zugriff auf andere 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
Textdateien
Was funktioniert und was nicht, hängt von der Intelligenz der Programme ab, die mit den Daten umgehen:
- Es gibt viele Programme, die die Kodierung der Textdateien (ISO8859-x, UTF-8, UTF-16, ...) erkennen und dann entsprechend interpretieren.
Die Desktopsysteme KDE und GNOME können gut mit der neuen Kodierungsart UTF-8 umgehen.
- Bestimmte Programme lassen sich die Kodierung durch Umgebungsvariable vorgeben oder suchen im Dokument nach einer expliziten Angabe (z.B. Webbrowser)
- Der problematischste Fall ist, dass eine Applikation eine feste Annahme über die zu verarbeitenden Daten trifft oder die neue Kodierung nicht versteht. Bei diesen Applikationen sollte man auf Alternativen ausweichen.
Dateinamen
Ein Vorteil ist, dass in Linux-/Unix-Systemen der Unicode in UTF-8-Kodierung
benutzt wird. Das bedeutet, dass alle ASCII-Zeichen (das sind die Groß- und
Kleinbuchstaben, Ziffern, einige Sonderzeichen wie Punkt, Komma, ... , aber nicht die Umlaute) 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
ISO8859-Kodierung unweigerlich zu falschen Darstellungen in einem System mit
UTF-8-Zeichen und umgekehrt. Eine Umbenennung ist hier unumgänglich.
- Hinweise und Problemlösungen bezüglich Unicode auf den vom URZ administrierten Rechnern sind in einer speziellen URZ-Unicode-FAQ-Liste
http://www.tu-chemnitz.de/urz/linux/faq/unicode.html 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.
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 heißt 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 internen 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 auf Grund des internen Kodes ein darstellbares Element aus einer Zeichensatzdatei ausgewählt wird (ggf. unter Hinzufügung von Attributen wie Größe, 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.
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 folgendermaßen 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!
Mit den heute immens gestiegenen Speichergrößen 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 |
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". Das entspricht genau der ASCII-Kodierung!
- Beginnt ein Byte mit mehr als einem "1"-Bit, so ist das der Beginn einer zusammengehörenden Bytefolge. Die Anzahl der "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 | 11000010 10000100 |
| kleines russisches "f" | 00000100 01000100 | 11010001 10110100 |
| 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.
Gerd Heide, April 2004