Was zählt als ein Zeichen?
Vier verschiedene Systeme zählen denselben Text auf vier verschiedene Arten. Bei englischem Fließtext stimmen sie überein – deshalb bleibt das Problem unsichtbar, bis es eines Tages nicht mehr so ist.
Zuletzt geprüft am
Ein Emoji, vier Antworten
Nehmen Sie einen Daumen hoch mit Hautfarbe oder das Familien-Emoji. Zählen Sie es auf vier Arten, und Sie erhalten vier Zahlen – keine davon ist falsch.
Ein Mensch sieht ein Zeichen. Ein Ding, ein Druck auf die Rücktaste, um es zu löschen.
Ein regulärer Ausdruck sieht womöglich sieben. Das Emoji besteht aus mehreren Codepoints, die durch unsichtbare Verbinder zusammengehalten werden – ein Basis-Emoji, ein Modifikator, ein Verbinder, ein weiteres Emoji und so weiter.
JavaScript meldet elf. Es speichert Text in 16-Bit-Einheiten, und alles außerhalb des Grundbereichs belegt zwei davon – jeder dieser Codepoints kann also doppelt zählen.
Eine Datenbankspalte sieht fünfundzwanzig Bytes. In UTF-8 kodiert belegt jeder Codepoint bis zu vier Bytes.
Bei gewöhnlichem englischem Text sind alle vier Zahlen identisch. Genau deshalb bleibt das Problem unsichtbar, bis jemand einen Namen mit Akzent, einen japanischen Satz oder ein einziges Emoji eingibt – und ein Feld, das drei Jahre lang funktioniert hat, plötzlich Daten abschneidet.
Welche Zahl Ihr Limit meint
Die praktische Frage ist nie „Wie lang ist dieser Text?“, sondern „Was begrenzt hier eigentlich?“ – und darauf gibt es vier gängige Antworten.
Eine Datenbankspalte, die als VARCHAR deklariert ist, zählt in den meisten Datenbanksystemen Bytes. Deshalb nimmt ein Feld, das problemlos 255 englische Zeichen akzeptiert, deutlich weniger japanische auf – drei Bytes pro Zeichen –, und deshalb passt ein Name mit Akzent gelegentlich nicht, obwohl die Version ohne Akzent passte.
Eine SMS umfasst 160 Zeichen in ihrem eigenen 7-Bit-Alphabet und fällt auf 70 pro Nachricht, sobald ein einziges Zeichen außerhalb davon liegt. Ein typografisches Anführungszeichen aus einer Textverarbeitung oder ein Emoji kann aus einer einteiligen Nachricht drei machen und Ihre Kosten verdreifachen.
Eine Formularprüfung in JavaScript zählt fast immer UTF-16-Einheiten. Deshalb lehnt ein Feld mit „280 Zeichen“ womöglich einen Text ab, der viel kürzer aussieht, wenn er voller Emojis ist.
Ein Mensch zählt, was er sieht – die einzige Definition, die für eine Überschrift, einen Title-Tag oder alles mit einem optischen Platzbudget zählt.
Wo die Zählungen auseinandergehen
Zu wissen, welche Eingaben Ärger machen, ist nützlicher als die Theorie – denn diese Eingaben sind vorhersehbar.
Emojis, besonders die zusammengesetzten – Hautfarben, Familien, Flaggen, Berufe. Eine Flagge besteht aus zwei regionalen Indikatorbuchstaben, ein Beruf meist aus einer Person, einem Verbinder und einem Gegenstand.
Akzentuierte und kombinierende Zeichen. Ein é kann als ein Codepoint geschrieben werden oder als e, gefolgt von einem kombinierenden Akut. Beide sehen identisch aus, werden unterschiedlich sortiert, gelten beim Vergleich als ungleich und zählen unterschiedlich – und beide Formen kommen in echten Daten vor, oft sogar in derselben Spalte.
Nicht-lateinische Schriften. Chinesische, japanische und koreanische Zeichen belegen in UTF-8 je drei Bytes. Hindi, Thai, Tamil und Arabisch bilden Zeichengruppen, die ein Mensch als eine Einheit wahrnimmt und die mehrere Codepoints lang sind.
Mathematische und musikalische Symbole, die außerhalb des Grundbereichs liegen und deshalb in UTF-16 doppelt zählen.
Was Sie dagegen tun können
Zählen Sie das, was Ihr Limit zählt. Ein Zähler, der alle vier Zahlen zeigt, beantwortet die Frage direkt – schneller, als darüber nachzudenken. Im Code nehmen Sie die passende Funktion: Intl.Segmenter in JavaScript zählt, was ein Mensch sieht, len(s.encode("utf-8")) in Python zählt Bytes, in PHP mb_strlen statt strlen.
Reparieren Sie die Spalte, nicht das Formular. Ist ein Datenbankfeld die Grenze, liegt die dauerhafte Lösung weiter vorn: Deklarieren Sie es in MySQL als utf8mb4 oder in PostgreSQL als text. Das ältere „utf8“ von MySQL speichert bekanntlich nur drei Bytes pro Zeichen und kann überhaupt kein Emoji ablegen – eine altbekannte Falle, die schon sehr viele echte Daten stillschweigend abgeschnitten hat. Sorgfältiges Zählen im Formular ist nur ein Behelf für eine Spalte, die anders hätte deklariert werden sollen.
Normalisieren Sie beim Eingang. Wird Text bei der Eingabe in eine einheitliche Normalform gebracht, werden die zwei Schreibweisen von é zu einer, und Vergleichen, Sortieren und Zählen stimmen überein. Jede Programmiersprache hat eine Funktion dafür, und das einmal an der Grenze zu erledigen, ist viel einfacher, als überall beide Formen zu behandeln.
Der verwandte Fall: Base64
Erwähnenswert, weil es dieselbe Art Überraschung auslöst. Base64-Kodierung nimmt jeweils drei Bytes und schreibt sie als vier Zeichen, das Ergebnis ist also etwa ein Drittel größer – das ist Arithmetik, keine Ineffizienz. Ein Anhang mit 6 MB wird zu rund 8 MB Text. Deshalb kann eine Datei, die deutlich unter einer Größengrenze liegt, abgelehnt werden, sobald sie für die Übertragung kodiert ist.
Dieselbe Rechnung erklärt, warum E-Mail-Anhänge an Grenzen scheitern, die sie scheinbar einhalten. Wenn Sie etwas an einer Obergrenze messen, messen Sie die kodierte Form.
Häufig gestellte Fragen
Warum lehnt mein Feld mit 255 Zeichen kürzeren Text ab?
Mit ziemlicher Sicherheit, weil es Bytes statt Zeichen zählt. Buchstaben mit Akzent belegen in UTF-8 zwei Bytes, CJK-Zeichen drei – 255 Bytes sind also womöglich nur 85 japanische Zeichen. Die Spalte als utf8mb4 oder text zu deklarieren, behebt das richtig.
Kostet mich ein Emoji wirklich drei SMS?
Das kann passieren. Eine Nachricht, die nur Zeichen aus dem GSM-Alphabet enthält, hat 160 Zeichen pro Teil; ein einziges Zeichen außerhalb davon stellt die gesamte Nachricht auf eine Kodierung mit 70 Zeichen um. Eine Nachricht mit 150 Zeichen und einem Emoji wird so zu drei Teilen statt einem.
Welche Zählung sollte ich für einen Title-Tag verwenden?
Keine davon exakt – Suchmaschinen kürzen nach Pixelbreite, nicht nach Zeichenzahl. Ein Titel aus breiten Großbuchstaben wird also früher abgeschnitten als einer aus schmalen Kleinbuchstaben. Rund 60 Zeichen sind die übliche Faustregel – ein Richtwert, keine Grenze.
Warum stimmen zwei identisch aussehende Zeichenketten nicht überein?
Meist, weil ein Zeichen mit Akzent auf zwei verschiedene Arten geschrieben ist – in der einen als einzelner Codepoint, in der anderen als Grundbuchstabe plus kombinierendes Zeichen. Normalisieren Sie beide vor dem Vergleich auf dieselbe Form, dann stimmen sie überein. Das lohnt sich an der Stelle, an der Daten in Ihr System gelangen.
Ist eine Wortzählung stabiler als eine Zeichenzählung?
Im Englischen meistens. Aber nicht überall: Chinesisch und Japanisch trennen Wörter nicht durch Leerzeichen, Thai ebenfalls nicht. Wörter zu zählen erfordert in diesen Schriften eine Segmentierung, und verschiedene Tools liefern verschiedene Ergebnisse.
Ebenfalls lesenswert
PDF zu groß für E-Mail
Die drei Gründe, warum ein PDF groß ist – und welche Lösung zu Ihrem passt.
Welches Bildformat?
Eine Frage entscheidet. JPG, PNG, WebP und AVIF ehrlich verglichen.
Gescannte PDFs und OCR
Warum ein Scan keinen Text enthält, was OCR hinzufügt und welche Einstellung die Genauigkeit bestimmt.