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.
- über die Tastatur des Computers oder Analyse mittels Texterkennungssystem -> Erzeugen des internen Kodes
- 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)
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.
| 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.
| 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 |
- 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.
| 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 |
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
- 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
- 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.
[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, YUDateinamen 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)
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")
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.


