Code Points
Ein Codepoint ist die Zuweisung einer eindeutigen Zahl zu einem Zeichen oder einem Symbol innerhalb eines definierten Coderaums (Code Space), so dass dieses Zeichen oder Symbol damit eindeutig identifizierbar und klassifizierbar wird. Das bekannteste und am weitesten verbreitete Codepoint-System ist Unicode.
Unicode Codepoints
Unicode ist der Versuch des Unicode-Konsortiums, jedem gebräuchlichen Zeichen jedes gebräuchlichen Alphabets der Welt sowie jedem gebräuchlichen Symbol inklusive Emoji einen eindeutigen Zahlenwert zuzuordnen. Hinzu kommen außerdem viele Satzzeichen und einige nicht druckbare Steuerzeichen.
Gestartet wurde dieses Projekt Ende der 1980er Jahre. Im Oktober 1991 wurde dann schließlich offiziell eine erste Version veröffentlicht, die 7129 Zeichen aus 24 Schriftsystemen enthielt. Anschließend wurden in regelmäßigen Updates immer mehr Zeichen ergänzt und inzwischen wurden bereits über 150.000 unterschiedliche Zeichen und Symbole aus über 170 Schriftsystemen sowie allen möglichen sonstigen Bereichen von Piktogrammen bis hin zu Smileys definiert. So gibt es beispielsweise inzwischen Unicode-Codepoints für die ägyptischen Hieroglyphen, für die römischen Zahlen, für geometrische Elemente und mathematische Symbole genauso wie für Schachfiguren oder Spielkartensymbole (Pik, Herz, Kreuz und Karo).
Unicode Transformation Formate
Wie aber kommen wir von dem reinen Zahlenwert zu einer Bytesequenz, mit der wir unsere Zeichen letztendlich speichern können? Die Herausforderung dabei ist, dass reine einzelne 1-Byte-Werte schließlich maximal nur 256 verschiedene Zahlen und folglich maximal 256 verschiedene Zeichen unterscheiden können. Und damit lassen sich die zahlreichen definierten Zeichen leider nicht einmal ansatzweise komplett darstellen. Daher benötigen wir eine Transformations-Formel, um aus den Codepoint-Zahlen eine eindeutige Bytesequenz zu machen.
Es gibt viele verschiedene Unicode-Transformation-Formate (abgekürzt "UTF") wie zum Beispiel UTF-8, UTF-16 oder UTF-32 die jeweils ihre eigenen Vorteile und Nachteile haben.
Am weitesten verbreitet ist UTF-8, das die Zeichen mit variabler Länge darstellt und daher am speichersparsamsten ist. Zeichen benötigen hier minimal nur ein einziges Byte, maximal vier Bytes. Als 1-Byte-Zeichen wird der US-ASCII-Range kodiert (Codepoints 0 bis 127) wodurch gleichzeitig in diesem Bereich eine Abwärtskompatibilität zu vielen alten Single-Byte-Kodierungen besteht. Aus diesem Grund können insbesondere englische Texte, die nur aus den lateinischen Grundbuchstaben und keinen Sonderzeichen bestehen von dieser Kodierung profitieren, da diese Texte dann nicht mehr als eine Single-Byte-Kodierung an Speicherplatz benötigen. Aber auch viele europäische Sprachen wie Deutsch, Spanisch oder Französisch profitieren erheblich, da in Texten dieser Sprachen nur wenige Zeichen außerhalb des ASCII-Ranges vorkommen (im Deutschen nur Ä, Ü, Ö und ß).
Alte Codepoint-Systeme
Vor der Erfindung des Unicode-Code-Point-Systems gab es schon viele andere Versuche, Zeichen eindeutigen Zahlenwerten zuzuordnen und damit speichern und maschinell verarbeiten zu können.
Die anfänglichen Systeme setzten unter anderem auch aufgrund des kostbaren Speicherplatzes zu jener Zeit auf Ein-Byte-Systeme, die daher nur 256 verschiedene Zeichen speichern konnten (1 Byte besteht aus 8 Bit, daher gibt es 2 hoch 8 = 256 unterschiedliche Kombinationen dieser Bits).
Entwickelt wurden dann unzählige dieser Systeme für die unterschiedlichsten Zwecke und Alphabete mit ganz verschiedenen Zeichenabdeckungen: Manche enthielten nur lateinische Buchstaben, andere lateinische und kyrillische Zeichen oder die spezifischen Umlaute, Diakritika und Währungssymbole bestimmter Regionen und Sprachen, wieder andere nur griechische Buchstaben oder mathematische Symbole - aber jeweils maximal nur 256 verschiedene Zeichen. Man musste also wissen, um welche Codepage es sich handelte, um die einzelnen Bytes korrekt interpretieren und in Zeichen übersetzen zu können und man stieß schnell an seine Grenzen wenn es dazu kam, Zeichen speichern zu wollen, die nicht Teil des gewählten oder verfügbaren Kontingents waren. Besonders schwierig wurde es, wenn innerhalb eines Textes oder einer Datei mehrere Sprachen mit komplett gegensätzlichen Zeichen vorkommen mussten.