# Zeichenkodierung

Eine Zeichenkodierung (englisch character encoding, kurz encoding) erlaubt die eindeutige Zuordnung von Schriftzeichen (i. A. Buchstaben oder Ziffern) und Symbolen innerhalb eines Zeichensatzes. In der elektronischen Datenverarbeitung werden Zeichen über einen Zahlenwert kodiert, um sie zu übertragen oder zu speichern. Der deutsche Umlaut Ü wird zum Beispiel im ISO-8859-1-Zeichensatz mit dem Dezimalwert 220 kodiert. Im EBCDIC-Zeichensatz kodiert derselbe Wert 220 die geschweifte Klammer }. Zur richtigen Darstellung eines Zeichens muss also die Zeichenkodierung bekannt sein; der Zahlenwert allein reicht nicht aus.
Zahlenwerte aus Zeichenkodierungen lassen sich auf verschiedene Art speichern oder übertragen, z. B. als Morsezeichen, verschieden hohe Töne (Faxgerät), verschieden hohe Spannungen.
Binäre Systeme hatten seit jeher eine besondere Bedeutung, da mit steigender Anzahl der Basiselemente des Codes die Gefahr von Verwechslungen steigt.
In älterer Fachliteratur wird mitunter auch gleichbedeutend der Begriff Zeichenverschlüsselung verwendet, wenn den Zeichen (Schlüssel-)Nummern zugeordnet werden; aufgrund der möglichen fälschlichen Zuordnung in den Bereich der Kryptographie wird diese Bezeichnung heute kaum noch verwendet.

## Geschichte

Die Anfänge dieser Technik liegen in der Antike. Zum Beispiel informierte Agamemnon seine Truppen von einem Schiff aus mit dem Licht eines Feuers darüber, dass er die Invasion Trojas starten wollte. Bekannt sind ferner Rauchzeichen bei den Indianern oder Nachrichtenübermittlung durch Trommelzeichen in Afrika.
Insbesondere zur Verständigung von Schiffsverbänden in der Nautik wurden die Techniken später verfeinert. Sir Walter Raleigh erfand für die Verständigung seines Geschwaders auf der Südamerikafahrt 1617 eine Art Vorläufer der Flaggencodierung.
Im Jahr 1648 schließlich war es Englands späterer König James II., der das erste Signalflaggensystem in der britischen Marine einführte.
Nach der Erfindung der Telegrafie benötigte man auch hier eine Zeichenkodierung. Aus den ursprünglichen Ideen des Engländers Alfred Brain entstanden 1837 der originale Morsecode und 1844 der modifizierte Morsecode.
Das CCITT (Comité Consultatif International Telegraphique et Telephonique) war schließlich die erste Institution, die einen standardisierten Zeichensatz definierte. Dabei basierte dieser Zeichensatz auf einem von Jean-Maurice-Émile Baudot 1870 entwickelten 5er-Code-Alphabet für seinen Synchrontelegraphen, dem Baudot-Code, dessen Prinzip noch heute verwendet wird.

## Computer und Datenaustausch

Mit der Entwicklung des Computers begann die Umsetzung der im Grunde schon seit dem Baudot-Code verwendeten binären Zeichenkodierung in Bit-Folgen, bzw. intern meist in verschiedene elektrische Spannungswerte als Unterscheidungskriterium, ganz analog zu der bisher zur Unterscheidung der Signalwerte genutzten Tonhöhe oder Signaldauer.
Um diesen Bit-Folgen darstellbare Zeichen zuzuordnen, mussten Übersetzungstabellen, sogenannte Zeichensätze, engl. Charsets, festgelegt werden. 1963 wurde eine erste 7-Bit-Version des ASCII-Codes durch die ASA (American Standards Association) definiert, um eine Vereinheitlichung der Zeichenkodierung zu erreichen. Obwohl IBM an der Definition mitgearbeitet hatte, führte man 1964 einen eigenen 8-Bit-Zeichencode EBCDIC ein. Beide finden bis heute in der Computertechnik Verwendung.
Da für viele Sprachen jeweils unterschiedliche diakritische Zeichen benötigt werden, mit denen Buchstaben des lateinischen Schriftsystems modifiziert werden, gibt es für viele Sprachgruppen jeweils eigene Zeichensätze. Die ISO hat mit der Normenreihe ISO 8859 Zeichenkodierungen für alle europäischen Sprachen (einschließlich Türkisch) und Arabisch, Hebräisch sowie Thai standardisiert.
Das Unicode Consortium schließlich veröffentlichte 1991 eine erste Fassung des gleichnamigen Standards, der es sich zum Ziel gesetzt hat, alle Zeichen aller Sprachen in Codeform zu definieren. Unicode ist gleichzeitig die internationale Norm ISO 10646.
Bevor ein Text elektronisch verarbeitet wird, muss der verwendete Zeichensatz und die Zeichenkodierung festgelegt werden. Dazu dienen beispielsweise folgende Angaben:
* Definition des Zeichensatzes in einer HTML-Seite
* Definition des Zeichensatzes in den Kopfzeilen (Headern) einer E-Mail oder eines HTTP-Pakets

## Grafische Darstellung

Das Vorhandensein von Software für Zeichenkodierung und -dekodierung garantiert noch nicht die richtige Darstellung auf dem Computerbildschirm. Zu diesem Zweck muss auch eine Schriftart verfügbar sein, die die Zeichen des Zeichensatzes enthält.

## Differenzierung der Begriffe durch Einführung des Unicodes

Mit Einführung des Unicodes mussten die Zeichen durch mehr als ein Byte dargestellt werden, und es wurden genauere Begriffe notwendig. Derzeit werden im Deutschen die Begriffe Zeichensatz, Code, Kodierung, encoding manchmal synonym, manchmal differenzierend verwendet. Im Englischen existieren bereits klare Differenzierungen:
* Ein Zeichensatz (character set oder character repertoire) ist eine Menge S verschiedener Schriftzeichen.
* Eine Codemenge oder Coderaum (code space) ist eine Menge M numerischer Werte, die zum Kodieren von Zeichen verfügbar sind.
* Ein Zeichencode (ccs, coded character set, codepage) ist ein Zeichensatz S mit einer Codemenge M und einer injektiven Abbildung der Schriftzeichen in S auf die Zahlen in M. (→ keine mehrfache Zuordnung, Bildmenge S ≤ Zielmenge M)
* Ein Codepunkt (codepoint) ist ein einzelner Wert aus der Codemenge M.
* Ein codiertes Zeichen (encoded character) ist ein Zeichen aus S zusammen mit seinem Codepunkt aus M. Ein Text wird durch die Codepunkte seiner Schriftzeichen dargestellt, also als Sequenz von Zahlen aus M.
Als nächstes muss man die Darstellung der Codepunkte im Rechner festlegen (encoding):
* Eine Codeeinheit (code unit) ist die Speichergröße für die Codepunkte mit der geringsten Größe, z. B. 8 Bits für UTF-8 und 16 Bits für UTF-16. Ein Codepunkt wird durch ein oder mehrere Codeeinheiten dargestellt.
* Mit encoding form (character encoding form, cef) bezeichnet man eine Abbildung der Codepunkte auf Codeeinheiten, z. B. UTF-16. Jedem Codepunkt wird eine Codeeinheit oder eine Folge von mehreren Codeeinheiten zugeordnet, wobei die Länge nicht für alle Codepunkte gleich sein muss.
* Mit encoding scheme (character encoding scheme, ces) bezeichnet man Kombination von encoding form und der Byte-Reihenfolge (big-endian oder little-endian), mit der eine Codeeinheit abgelegt wird; z. B. UTF-16LE.
In einfachen Fällen gibt es nicht mehr als 256 = 2$^8$ Codepunkte, so dass man jeden Codepunkt in einem Byte speichern kann, z. B. bei Verwendung eines der in ISO 8859 definierten Zeichencodes. Mit Unicode ist das nicht mehr möglich, da S weit mehr als 256 Zeichen enthält. Häufige Encodings sind UTF-8, UTF-16, UCS-2 und UTF-32.
Bei UTF-16 (cef) werden die Codepunkte zwischen 0 und 2$^{16}$−1 in zwei und alle größeren in vier Byte abgespeichert. Wie bei allen encodings mit mehr als einem Byte Elementlänge gibt es mindestens die zwei Schemen(ces) UTF-16BE (big-endian) und UTF-16LE (little-endian), die sich in der Reihenfolge der Bytes in einer Codeeinheit unterscheiden.
Bei UTF-32 verwendet man immer vier Byte für jeden Codepunkt, und UTF-8 verwendet je nach Codepunkt zwischen ein und vier Bytes: die Codepunkte 0 bis 127 werden in einem einzigen Byte gespeichert, so dass diese Darstellung bei den meisten englischen und anderen europäischen Texten (insbesondere ausschließlich Griechisch und slawische Sprachen mit kyrillischem Alphabet) platzsparend ist, denn die Zeichen mit diesen Codepunkten (Zeichen des ASCII) kommen mit Abstand am häufigsten vor. Weitere Verfahren sind etwa: SCSU, BOCU und Punycode. Komplexe Schemen können zwischen mehreren Varianten wechseln (ISO/IEC 2022).
Um die Reihenfolge der Bytes in einer Codeeinheit unmissverständlich anzugeben, wird oft ein BOM (byte order mark) vorangestellt (EF BB BF bei UTF-8; FF FE bei UTF-16LE; FE FF bei UTF-16BE).
Eine Glyphe ist eine grafische Darstellung eines einzelnen Schriftzeichens.
Beispiel: Das chinesische Schriftzeichen für Berg (山 shān) hat im Unicode den Codepunkt U+5C71 und benötigt zur Darstellung 15 Bit. Mit UTF-16 als cef wird es als eine Codeeinheit abgelegt. Mit ces Big-endian steht 5C 71 im Speicher, mit Little-endian 71 5C. Mit UTF-8 stehen die drei Codeeinheiten E5 B1 B1 im Speicher.
Zur Erleichterung für den verwirrten Leser sei noch angemerkt, dass die weitaus meisten Texte in einer der drei Unicode-encodings UTF-8, UTF-16BE oder UTF-16LE gespeichert sind, was den Umgang mit Texten wesentlich erleichtert.