Textlänge

Miss eine Zeichenkette auf mehrere sinnvolle Arten zugleich, inklusive Emojis und Hebräisch.

Eingabe
Zeichen
0
Codepunkte
0
UTF-16-Einheiten
0
Wörter
0
Zeilen
0

Warum „Wie lang ist dieser Text?“ mehr als eine Antwort hat

Es klingt wie eine triviale Frage, aber die Länge eines Textes hängt ganz davon ab, was man zählt. Ein Mensch zählt die Zeichen, die er sieht. Eine Datenbank zählt den Speicher, den ein Wert belegt. JavaScript zählt wieder etwas anderes. Wenn diese Zahlen nicht übereinstimmen – und bei Emojis, Buchstaben mit Akzent und nicht-lateinischen Schriften tun sie das oft nicht –, ist eine einzelne „Länge“ irreführend. Dieses Werkzeug zeigt fünf sinnvolle Maße nebeneinander, damit du das wählst, das für deinen Fall zählt.

Die fünf Maße erklärt

  • Zeichen (Grapheme): was ein Mensch als ein Zeichen wahrnimmt. Ein Familien-Emoji wie 👨‍👩‍👧 oder ein Buchstabe mit kombinierendem Akzent zählt als eines – das ist der Wert, der „mit dem Auge“ passt.
  • Codepunkte (code points): die Anzahl der Unicode-Skalarwerte. Ein einzelnes sichtbares Zeichen kann aus mehreren zusammengefügten Codepunkten bestehen, daher ist diese Zahl oft höher als die der Grapheme.
  • UTF-16-Einheiten: der Wert, den JavaScript über die .length-Eigenschaft einer Zeichenkette meldet. Zeichen außerhalb der Basic Multilingual Plane (die meisten Emojis) belegen je zwei UTF-16-Einheiten.
  • Wörter: die Anzahl wortartiger Token, Unicode-bewusst erkannt statt naiv an Leerzeichen getrennt.
  • Zeilen: die Anzahl der Zeilen, wobei jeder Zeilenumbruch gezählt wird.

Warum Emojis und Akzente das naive Zählen brechen

Moderner Text basiert auf Unicode, das viele sichtbare Zeichen als Folgen statt als einzelne Einheiten darstellt. Ein Flaggen-Emoji besteht aus zwei regionalen Indikatorsymbolen. Ein Familien-Emoji besteht aus mehreren Figuren, die durch unsichtbare „Zero-Width-Joiner“-Zeichen verbunden sind. Ein akzentuiertes é kann ein einzelner Codepunkt sein oder ein einfaches e gefolgt von einem kombinierenden Akzent. Jedes davon sieht wie ein Zeichen aus, kann aber je nach Maß als zwei, drei oder mehr zählen. Genau deshalb führt Zählen von Hand oder das Vertrauen auf eine einzige Zahl zu Fehlern.

Welchen Wert solltest du verwenden?

  • Zeichenlimits, die Menschen sehen (eine Bio, ein tweet-ähnliches Feld, eine SMS-Vorschau): verwende Zeichen (Grapheme), denn das entspricht dem, was der Nutzer zählt.
  • Zeichenketten-Verarbeitung in JavaScript, Indexierung oder Zerteilen: verwende UTF-16-Einheiten, da .length und Zeichenketten-Indizes darauf beruhen.
  • Datenbank-Spaltengrößen: prüfe, ob deine Spalte in Zeichen oder Bytes gemessen wird – viele sind byte-begrenzt, und UTF-8-Bytes unterscheiden sich wiederum von all diesen Werten.
  • Wort- oder Zeilenzählungen für Editoren und Lesbarkeit: verwende die Maße Wörter und Zeilen.

Häufig gestellte Fragen

Welche Zählung entspricht der String-Länge von JavaScript?
Der Wert der UTF-16-Einheiten entspricht der rohen .length-Eigenschaft von JavaScript. Wenn dein Code Zeichenketten zerteilt oder indexiert, bestimmt diese Zahl sein Verhalten.
Warum zählt ein Emoji als mehrere Zeichen?
Viele Emojis bestehen aus mehreren zusammengefügten Unicode-Codepunkten. Als Graphem (was du siehst) ist es ein Zeichen, aber seine Codepunkt- und UTF-16-Werte sind höher, weshalb jedes Maß getrennt angezeigt wird.
Zählt es abschließende Leerzeichen und Zeilenumbrüche?
Ja. Jedes Zeichen, das du einfügst, wird gezählt, einschließlich führender und abschließender Leerzeichen und Zeilenumbrüche. Wenn die Summen höher wirken als erwartet, prüfe auf unsichtbare abschließende Leerzeichen.
Wird mein Text irgendwohin gesendet?
Nein. Das gesamte Zählen erfolgt in deinem Browser. Der Text, den du eingibst oder einfügst, verlässt niemals dein Gerät.
Was ist ein Graphem?
Ein Graphem, oder „Graphem-Cluster“, ist ein vom Nutzer wahrgenommenes Zeichen – die kleinste Einheit, die ein Leser als ein einzelnes Zeichen bezeichnen würde, auch wenn sie aus mehreren Codepunkten besteht.
Wie unterscheiden sich Bytes von diesen Werten?
Bytes hängen von der Kodierung ab. In UTF-8 ist ein ASCII-Buchstabe ein Byte, die meisten akzentuierten und nicht-lateinischen Zeichen zwei oder drei und viele Emojis vier. Keines der fünf Maße hier ist eine Byte-Zählung, daher kodiere für byte-begrenzte Felder zuerst nach UTF-8.