Die Frage „wie lang ist dieser Text“ hat mindestens vier Antworten: Zeichen, Codepunkte, UTF-8-Bytes und UTF-16-Einheiten. Solange nur ASCII vorkommt, sind alle gleich — sobald Umlaute oder Emojis dabei sind, gehen sie auseinander.
Genau daran scheitern Zeichenbegrenzungen: Eine Spalte für 255 Bytes fasst 255 lateinische Buchstaben, aber nur 127 Umlaute und knapp 64 Emojis.
Vier Zählungen, vier Zahlen
Ein Emoji wie das Brezelzeichen ist ein Codepunkt, ein Zeichen für den Leser, vier Bytes in UTF-8 und zwei Einheiten in UTF-16. Eine Flagge aus zwei regionalen Buchstaben ist zwei Codepunkte, aber ein Zeichen — und acht Bytes.
In JavaScript zählt die Eigenschaft length UTF-16-Einheiten, was bei Emojis zu viel ergibt. In PostgreSQL zählt eine Beschränkung Zeichen, in MySQL je nach Definition Zeichen oder Bytes, und in vielen Protokollen zählen Bytes. Wer die falsche Zählung nimmt, schneidet Text mitten im Zeichen ab.
Warum Latin-1 immer noch auftaucht
Alte Systeme, Druckerschnittstellen und manche Bankformate erwarten weiterhin eine Kodierung mit genau einem Byte je Zeichen. Sie fasst 256 verschiedene Zeichen — genug für Westeuropa, aber weder für das Euro-Zeichen an seiner heutigen Stelle noch für Polnisch oder Türkisch.
Der Rechner zeigt deshalb an, ob sich der Text überhaupt verlustfrei in Latin-1 abbilden lässt. Steht dort ein Hinweis auf nicht darstellbare Zeichen, wird die Übertragung sie durch Fragezeichen ersetzen.