Auch genannt: Zeichencodierung, Character Encoding
Zeichenkodierung ist ein Verfahren, das Textzeichen als Zahlen und schließlich als Folgen von Speichereinheiten darstellt. Damit ein Programm dieselbe Textfolge wiederherstellen kann, müssen schreibende und lesende Seite dieselbe Kodierung vereinbaren oder zuverlässig erkennen. Unicode schafft dafür einen gemeinsamen Zeichenvorrat: Der Standard weist Zeichen eindeutige Nummern zu, unabhängig von Plattform, Programm und Sprache.Unicode Consortium: What is Unicode?
Ein Buchstabe auf dem Bildschirm ist nicht einfach ein „Buchstabe im Speicher“. Software muss festlegen, welche Zahl ein Zeichen bezeichnet und wie diese Zahl in Bytes abgelegt wird. Bei Unicode heißt die Zahl eines Zeichens Codepunkt und wird üblicherweise hexadezimal mit dem Präfix U+ notiert. So steht etwa U+0041 für den lateinischen Großbuchstaben A. Ein Codepunkt ist damit eine abstrakte Zuordnung, nicht automatisch die Bytefolge in einer Datei oder im Netzwerk.
Diese Trennung ist wichtig: Ein Text kann in UTF-8, UTF-16 oder UTF-32 gespeichert sein. Die Unicode-Spezifikation beschreibt diese als verschiedene Kodierungsformen, die Unicode-Skalare auf Folgen von 8-, 16- oder 32-Bit-Codeeinheiten abbilden.Unicode Standard, Kapitel 2 Die sichtbare Bedeutung des Textes soll dabei erhalten bleiben, auch wenn seine technische Darstellung wechselt.
Der Codepunkt beantwortet die Frage: Welches Zeichen oder welche standardisierte Textkomponente ist gemeint? Die Bytefolge beantwortet die andere Frage: Wie liegen die Informationen konkret in einer Datei, einer Datenbank oder einem Datenstrom vor? Beide Ebenen werden oft verkürzt als „Zeichenkodierung“ bezeichnet, sollten bei Fehleranalysen aber auseinandergehalten werden.
Nicht jeder Codepunkt steht für einen sichtbaren Buchstaben. Es gibt beispielsweise Steuer- und Formatzeichen. Umgekehrt kann ein sichtbares Ergebnis aus mehreren Codepunkten bestehen, etwa wenn ein Grundzeichen mit einem kombinierenden Akzent zusammenkommt. Zudem ist ein Zeichen nicht mit seinem Bild gleichzusetzen: Die Schriftart entscheidet, welche Glyphe zum Text gezeichnet wird. Eine fehlende Schrift kann daher anders aussehen als eine falsche Dekodierung, obwohl beide Probleme für Nutzende ähnlich wirken können.
UTF-8 ist eine Unicode-Kodierung mit variabler Länge. ASCII-Zeichen bleiben darin als einzelne Bytes im Bereich 00 bis 7F erhalten. Andere Unicode-Werte werden mit mehreren Bytes dargestellt. RFC 3629 beschreibt UTF-8 als Transformationsformat von ISO/IEC 10646 und hebt die Erhaltung des US-ASCII-Bereichs als Kompatibilitätsmerkmal hervor.RFC 3629: UTF-8
Beim Speichern wandelt ein Encoder die Codepunkte eines Textes in eine gültige Bytefolge der gewählten Kodierung um. Beim Lesen prüft ein Decoder die Bytes nach deren Regeln und rekonstruiert daraus Codepunkte. Für einen Austausch reicht es deshalb nicht, nur „Unicode“ zu sagen: Unicode bezeichnet den Zeichensatz und seine Regeln; UTF-8 benennt eine konkrete Darstellungsform. In Webprojekten wird die Wahl oft zusätzlich in HTTP-Headern, HTML-Metadaten oder Dateiformaten festgehalten, damit Empfänger die Bytes passend interpretieren können.
Ein Team exportiert Kundennamen als CSV in UTF-8. Die Datei enthält den Namen „Müller“. Wird sie in einem Programm geöffnet, das die Bytes fälschlich als eine ältere Einbyte-Kodierung deutet, können statt des Ü Buchstabenfolgen wie „Müller“ erscheinen. Der ursprüngliche Text muss dabei nicht verändert worden sein: Die gespeicherte Bytefolge wurde lediglich mit der falschen Regel gelesen.
Die Abhilfe besteht nicht darin, einzelne kaputte Zeichen blind zu ersetzen. Zuerst sollte klar sein, in welcher Kodierung die Quelldatei tatsächlich vorliegt und welche Kodierung das Ziel erwartet. Danach lässt sich die Datei kontrolliert dekodieren und neu ausgeben. Bei automatisierten Importen gehören ein expliziter Zeichensatz, Testdaten mit Umlauten sowie eine Prüfung auf ungültige Bytefolgen in die Schnittstellenvereinbarung.
Typische Warnzeichen sind Fragezeichen, Ersatzzeichen, unerwartete Sonderzeichen oder scheinbar zufällige Zeichenfolgen nach einem Import. Sie können entstehen, wenn Metadaten fehlen, wenn Sender und Empfänger unterschiedliche Annahmen treffen oder wenn Daten unterwegs abgeschnitten beziehungsweise beschädigt wurden. Eine gültige UTF-8-Sequenz hat feste Strukturregeln; RFC 3629 beschreibt dafür zulässige Bytefolgen und weist auch auf Sicherheitsaspekte fehlerhafter oder überlanger Sequenzen hin.RFC 3629: UTF-8
Robuster Textaustausch beginnt mit einer eindeutigen Festlegung, etwa UTF-8, und einer konsistenten Umsetzung in Datenbank, Anwendung, Datei-Export und Schnittstelle. Eingaben sollten beim Einlesen validiert werden. Protokolle und Fehlermeldungen müssen die verwendete Kodierung benennen, statt nur „Sonderzeichenfehler“ zu melden. Das verkürzt die Suche, weil klar wird, ob die Ursache beim Speichern, Übertragen oder Anzeigen liegt.
Unicode ist kein Synonym für UTF-8. Unicode definiert unter anderem den gemeinsamen Raum der Codepunkte und Eigenschaften von Zeichen; UTF-8 ist eine von mehreren Unicode-Kodierungsformen. Eine Zeichenkodierung ist auch keine Schriftart: Fonts liefern grafische Formen für Zeichen, ändern aber nicht deren Codepunkte oder die Bytes einer Datei. Ebenso ist die Kodierung nicht mit einer Sprache gleichzusetzen. Derselbe Kodierungsstandard kann Texte in vielen Sprachen und mit technischen Symbolen darstellen.