Zeichen zählen gegen ein Limit, das jemand anderes gesetzt hat
Veröffentlicht am 10.8.2026 · 11 Min. Lesezeit · Text- & Sprach-Tools
Daniel Okonkwo — Front-end-Entwickler und Tech-Redakteur bei OneKitly
Web-Performance · Dateiformate
Anhand von 4 Quellen geprüft
„Zeichen“ ist nicht eine Sache, und wer das Limit geschrieben hat, hat entschieden welche, ohne es dir zu sagen. Der Häufigkeitszähler auf dieser Seite läuft mit einem Code-Point-Iterator durch die Zeichenkette, zählt also Unicode-Codepunkte. Füge das Familien-Emoji ein, und er gibt fünf Zeilen zurück, deren Summe sieben ist: vier Zeilen für die vier Personen und eine Zeile für etwas, das überhaupt nichts darstellt — den Zero Width Joiner, mit der Zahl 3. Dieselbe Zeichenkette ist 1 Graphem-Cluster, 7 Codepunkte, 11 UTF-16-Codeeinheiten und 25 UTF-8-Bytes. Diese vier Zahlen nennen vier verschiedene Systeme ihre Länge, also lässt ein Feld mit der Aufschrift 500 Zeichen 500 davon zu, wenn es Grapheme zählt, 71 bei Codepunkten, 45 bei JavaScripts .length oder Javas .length(), und 20, wenn die Spalte dahinter 500 Bytes hat. Das Werkzeug druckt keine Summe; die Spalte addierst du selbst, und seine Voreinstellungen überspringen Leerraum und falten Groß-/Kleinschreibung — deshalb ergibt „Merci beaucoup !“ 11 Zeilen mit der Summe 14 statt 16 Zeichen. SMS ist strenger. Das Übertragungsprotokoll trägt 140 Oktette, also 160 Zeichen des GSM-7-Bit-Alphabets oder 70 in UCS-2, und 153 beziehungsweise 67, sobald Nachrichten verkettet werden. Ein einziges Zeichen außerhalb der 7-Bit-Tabelle kippt die ganze Nachricht: ein typografischer Apostroph reicht, jedes Emoji reicht, und die spanischen á í ó ú und portugiesischen ã õ reichen auch, denn die Standardtabelle enthält sie schlicht nicht. Meta-Beschreibungen werden gar nicht gezählt: Snippets werden nach gerenderter Breite abgeschnitten, nicht nach Zeichenzahl.
Ein Emoji ist 1 Zeichen, oder 7, oder 11, oder 25 — je nachdem, wer zählt. Welches dein Formular, deine Datenbank und dein SMS-Gateway meinen, und ein Test mit einem einzigen Einfügen, der es dir verrät.
Vier Zahlen für ein Emoji
Nimm das Familien-Emoji aus Mann, Frau, Mädchen und Junge. Auf dem Bildschirm ist es eine Sache, ein Druck auf Rücktaste löscht es, und der Textcursor überspringt es in einem Schritt. Darunter sind es vier Personen-Emoji, getrennt durch drei Kopien eines unsichtbaren Steuerzeichens, U+200D, des Zero Width Joiners. Vierfach gemessen ist diese Zeichenkette 1 Graphem-Cluster, 7 Codepunkte, 11 UTF-16-Codeeinheiten und 25 UTF-8-Bytes. An keiner dieser Zahlen ist etwas falsch; sie beantworten vier verschiedene Fragen.
Der Graphem-Cluster ist das vom Nutzer wahrgenommene Zeichen, und Unicode legt die Grenzen dazwischen in einem technischen Anhang fest, UAX #29 — gerade weil „was eine Leserin für ein Zeichen hält“ nicht offensichtlich genug ist, um es jedem Programm selbst zu überlassen. Der Codepunkt ist der nummerierte Eintrag im Unicode-Katalog. Die UTF-16-Codeeinheit ist ein Sechzehn-Bit-Platz, und alles oberhalb von U+FFFF braucht zwei davon — das ist die Zahl, die JavaScript, Java und C# melden, wenn man nach der Länge fragt. Das UTF-8-Byte ist das, was tatsächlich über die Leitung geht und in einer Datenbankspalte sitzt.
Was dieses Werkzeug genau zählt
Der Häufigkeitszähler durchläuft die Eingabe mit einer for-of-Schleife, die in JavaScript über Codepunkte geht und nicht über Sechzehn-Bit-Einheiten. Er zählt also Codepunkte, und man kann ihm dabei zusehen. Füge das Familien-Emoji mit den Voreinstellungen ein, und die Ausgabe hat fünf Zeilen: eine leer wirkende Zeile mit der Zahl 3, dann vier Zeilen mit je 1. Die leere Zeile ist der Zero Width Joiner. Addiere die Spalte, und du erhältst 7 — die Codepunkt-Zahl, nicht die 1, die du nennen würdest, wenn dich jemand fragt, wie viele Zeichen du eingefügt hast.
Zwei Voreinstellungen verändern die Rechnung, bevor du sie siehst. „Leerzeichen überspringen“ ist an, Leerzeichen tauchen also nie in der Tabelle auf: „Merci beaucoup !“ hat 16 Zeichen, ergibt aber 11 Zeilen mit der Summe 14, weil die beiden Leerzeichen wegfallen. „Groß/Klein ignorieren“ ist ebenfalls an und legt Paare zusammen — meist genau das, was man will, gelegentlich aber etwas Seltsames. Das türkische große İ wird zu einem kleinen i plus einem separaten kombinierenden Punkt, sodass die Tabelle eine Zeile bekommt, deren Schlüssel zwei Codepunkte lang ist. Das Werkzeug hat nie behauptet, der Zeilenschlüssel sei ein einzelnes Zeichen; er ist, was die Kleinschreibung ergeben hat.
Und es druckt keine Summe. Die Ausgabe ist eine zweispaltige Tabelle aus Zeichen und Anzahl, sortiert nach Anzahl und dann alphabetisch, und die Zahl, deretwegen du gekommen bist, ist vermutlich die Summe der zweiten Spalte. Wer die vier Zahlen ohne Rechnen nebeneinander will, nimmt den UTF-8-Byte-Zähler dieser Seite: Er druckt Grapheme, Codepunkte, UTF-8-Bytes, UTF-16-Einheiten, Wörter und Zeilen auf einmal — er existiert genau deshalb, weil diese Zahlen auseinandergehen, und sein eigener Kommentar sagt das.
Der Ein-Einfüge-Test, der dir verrät, welcher Zähler vor dir sitzt
Füge ein Familien-Emoji in das Feld mit dem Zähler ein und lies den Zähler. Steht dort 1, zählt er Graphem-Cluster. Steht dort 7, Codepunkte. Steht dort 11, benutzt er die native Stringlänge der Sprache, also UTF-16-Codeeinheiten — JavaScript, Java oder C#. Steht dort 25, zählt er UTF-8-Bytes, und das Limit ist in Wahrheit ein Byte-Limit. Vier mögliche Antworten, vier verschiedene Systeme hinter dem Feld, und der Test besteht aus einem Einfügen.
Der Test hat eine zweite Hälfte, und die wiegt schwerer: Der Zähler, den du im Browser siehst, ist nicht zwingend der, der entscheidet. Ein Frontend-Zähler ist fast immer JavaScripts .length, während die Ablehnung beim Absenden von einem Server, einer Spaltendefinition oder einer nachgelagerten API mit eigener Vorstellung kommt. Lässt dich das Feld 500 tippen und das Speichern scheitert bei 480, zählen beide Enden unterschiedlich, und das kürzere gewinnt. Tippe den Text, speichere, lade die Seite neu und sieh, was zurückkommt — eine Kürzung sieht man leichter, als man sie vorhersagt.
SMS: 160 Zeichen oder 70 — und ein Apostroph entscheidet
Der Kurznachrichtendienst trägt bis zu 140 Oktette Nutzdaten. Packe sie mit dem GSM-7-Bit-Standardalphabet, und es passen 160 Zeichen hinein; kodiere sie als UCS-2 mit zwei Byte je Einheit, und es passen 70. Ist eine Nachricht zu lang, wird sie geteilt, und jeder Teil gibt Platz an einen kleinen Kopf ab, der sagt, welcher Teil er ist: Es bleiben 153 Sieben-Bit-Zeichen oder 67 UCS-2-Einheiten pro Segment. Daran ist nichts verhandelbar, und jede Preisliste für Massen-SMS ist darauf gebaut.
Interessant ist, was in dieser 7-Bit-Tabelle steht, denn ein einziges Zeichen außerhalb kippt die ganze Nachricht auf UCS-2 und halbiert die Kapazität mehr als. Die Tabelle enthält durchaus einen großzügigen Satz Akzente — è é ù ì ò à ä ö ü ñ å æ ø ß sowie Ä Ö Ü Ñ É Å Æ Ø Ç — dazu ¡ ¿ § und eine Handvoll Währungszeichen. Sie enthält kein á, í, ó oder ú, und kein ã oder õ. Eine spanische Nachricht mit „está“ oder „aquí“ oder eine portugiesische mit „não“ ist also eine 70-Zeichen-Nachricht und keine mit 160, und nichts auf dem Bildschirm sagt das der Absenderin.
Die Spezifikation hat das vorausgesehen und definiert nationale Sprachtabellen — Spanisch bekommt eine Single-Shift-Tabelle, Portugiesisch eine Single-Shift- und eine Locking-Shift-Tabelle. Ein Single-Shift-Zeichen kostet zwei deiner Sieben-Bit-Plätze statt einem, und beide Enden müssen den Mechanismus umsetzen. In der Praxis versuchen es die meisten Gateways nicht und fallen stattdessen auf UCS-2 zurück. Derselbe Escape-Mechanismus ist der Grund, warum einige gängige Symbole schon in einer gewöhnlichen Nachricht je zwei Plätze kosten: das alleinstehende Zirkumflex, die geschweiften Klammern, die eckigen Klammern, der Rückstrich, die Tilde, der senkrechte Strich und das Eurozeichen stehen in der Erweiterungstabelle, nicht in der Haupttabelle. Und der typografische Apostroph, den deine Textverarbeitung eingesetzt hat, als du einen geraden tippen wolltest, steht in keiner von beiden.
Die Meta-Description wird in Pixeln gemessen, nicht in Zeichen
Jede SEO-Checkliste nennt eine Zeichenspanne für die Meta-Description. Googles eigene Dokumentation nennt keine: Sie sagt, es gebe keine Längenbegrenzung, das Snippet werde aus der Seite und mitunter aus der Description erzeugt, und Snippets würden zugeschnitten, damit sie ins Ergebnis passen. Passen ist eine Frage der gerenderten Breite: Eine Description voller breiter Buchstaben wird früher abgeschnitten als eine gleich lange aus schmalen, und das mobile Ergebnis hat weniger Platz als das am Rechner.
Die praktische Folge ist nicht, ein Zeichenbudget aufzugeben, sondern es nicht länger für eine Regel zu halten. Setze das, was überleben muss, in die erste Satzhälfte, und prüfe dann das echte Ergebnis statt der Zahl. Und rechne damit, dass Google die Description häufig ganz neu schreibt, wenn es den Seiteninhalt für die passendere Antwort hält — eine gekürzte Description, die du nie geschrieben hast, ist ein anderes Problem als eine, die du geschrieben hast.
Zwei Schreibungen desselben Wortes, zwei Längen
Eine letzte Falle hat mit Emoji nichts zu tun. Der Buchstabe é kann ein Codepunkt sein, U+00E9, oder zwei: ein einfaches e gefolgt von einem kombinierenden Akut. Sie sehen identisch aus, bedeuten dasselbe und haben verschiedene Längen — 1 Codepunkt und 2 Bytes gegen 2 Codepunkte und 3 Bytes. Die meisten Tastaturen erzeugen die erste Form; manche Betriebssysteme, manche Scanner und sehr viel kopierter Text erzeugen die zweite. Schickt man die zerlegte Form durch den Häufigkeitszähler, kommt sie als zwei Zeilen zurück, davon eine ein nackter Akzent, der auf nichts sitzt.
Scheitert eine Längenprüfung an Text, der die richtige Länge zu haben scheint, ist das die erste Sache zum Testen. Vor dem Zählen in die zusammengesetzte Form zu normalisieren behebt es, und das ist ein einziger Aufruf in jeder Sprache mit Unicode-Bibliothek. Tu es vor dem Zählen, vor dem Speichern und vor dem Vergleich zweier Zeichenketten auf Gleichheit — dasselbe Wort in zwei Normalisierungsformen ist in keinem Byte-Vergleich gleich.
| Zähleinheit | Das Familien-Emoji zählt als | Wo du ihr begegnest | Wie viele unter „500 Zeichen“ passen |
|---|---|---|---|
| Graphem-Cluster (UAX #29) | 1 | Swifts String.count; ein Druck auf Rücktaste; die erste Zeile des UTF-8-Byte-Zählers | 500 |
| Unicode-Codepunkte | 7 — vier Personen plus drei Joiner | Pythons len(); Go-Runen; der Zeichenhäufigkeits-Zähler auf dieser Seite | 71 |
| UTF-16-Codeeinheiten | 11 | JavaScript .length, Java .length(), C# .Length — die meisten Formularzähler im Browser | 45 |
| UTF-8-Bytes | 25 | Gos len(); eine Spalte oder ein Header, gemessen in Bytes | 20 |
| UCS-2-Einheiten in einem SMS-Segment | 11 | Ein einzelnes Segment mit 70 Einheiten, oder 67 bei verketteten Nachrichten | 6 pro Segment — das siebte beginnt eine neue Nachricht |
Häufige Fragen
- Warum hat die Häufigkeitstabelle eine leere Zeile?
- Weil ein Zeichen, das nichts darstellt, trotzdem ein Zeichen ist, und der Zähler das ehrlich meldet. Im Familien-Emoji ist diese Zeile U+200D, der Zero Width Joiner, der dreimal vorkommt: Er klebt die vier Personen zu einem Bild zusammen. Variantenselektoren verhalten sich genauso — das kleine U+FE0F, das ein einfarbiges Symbol in ein farbiges Emoji verwandelt, ist unsichtbar und wird gezählt. Eine leere Zeile mit einer Zahl daneben ist das Werkzeug, das dir sagt, dass dein Text etwas enthält, das du nicht siehst — genau das, was man wissen will, bevor man ihn in ein Feld mit Limit einfügt.
- Halbiert ein einziges Emoji wirklich meine SMS?
- Mehr als das. Eine Nachricht wird von Anfang bis Ende in einem Alphabet kodiert, ein einziges Zeichen außerhalb der GSM-7-Bit-Tabelle zwingt die ganze Nachricht also in UCS-2, und die Kapazität fällt von 160 Zeichen auf 70. Bei Emoji ist es schlimmer: Alles oberhalb von U+FFFF belegt zwei UCS-2-Einheiten, ein einfaches lächelndes Gesicht kostet also zwei deiner 70 und das Familien-Emoji elf. Sechs solcher Emoji und ein Wort passen nicht in ein einzelnes Segment. Ist deine Rechnung für Massen-SMS gestiegen, ohne dass der Text länger wurde, suche zuerst nach einem typografischen Apostroph oder einem Akzent, den die Tabelle nicht trägt.
- Mein Formular sagt 500 Zeichen. Welche 500 meint es?
- Teste es, statt zu raten. Füge ein Familien-Emoji ein und lies den Zähler: 1 heißt Graphem-Cluster, 7 heißt Codepunkte, 11 heißt UTF-16-Codeeinheiten, 25 heißt UTF-8-Bytes. In reinem ASCII stimmen alle vier überein, und deshalb zeigt sich der Unterschied erst, wenn eine echte Nutzerin einen Namen mit Akzent oder ein Emoji einfügt. Gehört dir das Formular, zähle für die sichtbare Zahl Graphem-Cluster und validiere gegen das, was die Speicherschicht tatsächlich erzwingt; setze das sichtbare Limit dann auf den kleineren der beiden Werte. Gehört es dir nicht, nimm die kleinste plausible Antwort an und lass Luft.
- Ist ein VARCHAR(500) in der Datenbank fünfhundert Bytes oder fünfhundert Zeichen?
- In den gängigen relationalen Datenbanken ist die deklarierte Länge in Zeichen angegeben, nicht in Bytes — aber die Grenzen ringsum sind in Bytes, und genau dort tappt man hinein. Eine Zeile hat eine Maximalgröße in Bytes, ein Index eine maximale Schlüsselgröße in Bytes, und eine Kodierung mit vier Bytes je Zeichen vervielfacht beides. Die Spalte nimmt deine 500 Zeichen also an, und der Index lässt sich nicht anlegen. Byte-Limits sind außerhalb der Datenbank häufiger: HTTP-Header-Werte, Message-Queue-Payloads, Object-Storage-Schlüssel und viele Fremd-APIs sind in Bytes spezifiziert. Wenn die Dokumentation Bytes sagt, zähle Bytes.
- Wie viele Zeichen soll eine Meta-Description haben?
- Es gibt keine dokumentierte Zahl, und jede konkrete, die dir genannt wurde, ist aus Suchergebnissen gemessen und nicht als Regel veröffentlicht. Googles Hinweis lautet, dass Descriptions keine Längenbegrenzung haben, dass Snippets ebenso aus der Seite wie aus der Description stammen und dass sie zugeschnitten werden, damit sie passen — und Passen ist eine Frage der gerenderten Breite in einem Layout, das sich zwischen Telefon und Rechner unterscheidet. Die nützliche Gewohnheit ist, vorne zu laden: Setze die Aussage, die Zahl oder das Unterscheidungsmerkmal in den ersten Teilsatz und behandle alles danach als entbehrlich. Dann sieh dir das echte Ergebnis in einer echten Suche an und richte dich danach.
Artikel, die dich interessieren könnten
Alle Ratgeber →Ähnliche Tools
Das hier beschreibt, was diese Textwerkzeuge heute tun — geprüft, indem ihre eigenen Funktionen mit genau den hier zitierten Eingaben ausgeführt wurden. Wo ein Werkzeug einen Fall falsch behandelt, steht das da, statt geglättet zu werden: Ein Werkzeug, das man nicht vorhersagen kann, ist schlimmer als eines, dessen Grenzen man kennt. Nichts davon ist eine Regel, an die ein Werkzeug gebunden wäre: Großschreibung, Zeichenzählung und Zeilennummerierung sind Konventionen, und diese Konventionen unterscheiden sich je nach Sprache, Stilhandbuch und dem Programm am anderen Ende. Bevor du eines davon über Text laufen lässt, den du nicht neu tippen kannst, lauf zuerst über eine Kopie und vergleiche beide Enden.
Quellen
- Unicode Consortium — UAX #29, Unicode Text Segmentation — the grapheme cluster boundary rules that define a user-perceived character, including the treatment of zero-width joiners, variation selectors and emoji modifier sequences
- ETSI / 3GPP — TS 123 038 (3GPP TS 23.038) — the GSM 7-bit default alphabet table in clause 6.2.1, its escape-driven extension table in 6.2.1.1 (which holds the caret, braces, brackets, backslash, tilde, vertical bar and euro sign), and the national language single- and locking-shift tables for Spanish and Portuguese in 6.2.1.2 and Annex A
- ETSI / 3GPP — TS 123 040 (3GPP TS 23.040) — the transfer of short messages: the user data of an SM MT or SM MO carries up to 140 octets, which is what yields 160 seven-bit characters or 70 UCS-2 units per single message
- Google Search Central — Control your snippets in search results — no documented character limit for a description; snippets are generated from the page and from the description and are trimmed to fit the result
Hast du einen Fehler in diesem Artikel entdeckt?