Textlänge

Zähle einen Text auf fünf Arten: Zeichen, wie du sie siehst, Codepunkte (len() von Python), UTF-16-Einheiten (.length von JavaScript), Wörter und Zeilen.

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.

Was Python und JavaScript jeweils „Länge“ nennen

Zwei der fünf Zahlen oben sind die, wegen derer die meisten hier landen, und sie gehören zu verschiedenen Sprachen. len() in Python und .length in JavaScript heißen beide „die Länge einer Zeichenkette“, und bei allem jenseits von reinem ASCII antworten sie für denselben Text im selben Moment verschieden. Keine von beiden irrt sich: Sie zählen verschiedene Einheiten, und beide Felder stehen oben nebeneinander, damit du den Unterschied ablesen statt raten musst.

  • Python: len() liefert die Anzahl der Unicode-Codepunkte, denn eine Zeichenkette in Python 3 ist eine Folge von Codepunkten. Lies das Feld „Codepunkte“ — genau diese Zahl gibt dir len().
  • JavaScript: .length liefert die Anzahl der UTF-16-Codeeinheiten, denn eine JavaScript-Zeichenkette wird als UTF-16 gehalten. Lies das Feld „UTF-16-Einheiten“. Array.from(text).length läuft dagegen codepunktweise durch die Zeichenkette und stimmt damit mit Python überein.
  • Keine von beiden zählt das, was du siehst. Das Feld „Zeichen“ ist die Graphem-Zählung, und keine eingebaute Länge der beiden Sprachen liefert sie: JavaScript braucht Intl.Segmenter, Python ein Paket von außen. Wenn die Grenze, die du durchsetzt, eine ist, die ein Mensch liest, ist das dein Feld.
  • Wörter und Zeilen gehören ebenfalls zu keiner der beiden Sprachen. Beide können sie durch Trennen an Leerzeichen und an Zeilenumbrüchen annähern, und beide weichen von den Zahlen hier ab, die Unicode-bewusst sind — bei Text ohne Leerzeichen, bei Satzzeichen und bei einem Zeilenumbruch am Textende.

Das Beispiel hinter Beispiel laden zeigt den Unterschied am schnellsten. Sein Familien-Emoji ist für einen Leser ein Zeichen, für Python fünf Codepunkte und für JavaScript acht UTF-16-Einheiten: drei dieser fünf Codepunkte liegen außerhalb der Basic Multilingual Plane und kosten je zwei Einheiten, und die zwei unsichtbaren Verbinder dazwischen je eine. Ein Feld, in das jemand zwanzig Zeichen schreiben darf, hält also wirklich zwanzig fürs Auge, während eine naive Prüfung in einer der beiden Sprachen Text ablehnt, der hineinpasst.

Länge ist nicht Größe in Bytes

Keine der fünf Zahlen oben ist eine Byte-Zahl, und die beiden werden leicht verwechselt. Eine Zählung ist eine Eigenschaft des Textes selbst; eine Größe in Bytes ist eine Eigenschaft des Textes, nachdem er in irgendeiner Kodierung niedergeschrieben wurde — derselbe Text hat in UTF-8 die eine Größe und in UTF-16 eine andere. Was in Bytes gemessen wird, muss deshalb nach dem Kodieren gemessen werden, und welche Kodierung gewählt wurde, gehört zur Antwort.

  • UTF-8 nutzt praktisch alles, und es hat variable Breite: ein ASCII-Buchstabe, eine Ziffer oder ein Satzzeichen ist ein Byte, die meisten akzentuierten und nicht-lateinischen Zeichen sind zwei oder drei, und viele Emojis sind vier. Hundert Zeichen sind nur dann hundert Bytes, wenn jedes einzelne ASCII ist — dieselben hundert Zeichen auf Griechisch, Hebräisch, Arabisch oder Chinesisch sind das Zwei- bis Dreifache.
  • Python: len() zählt Codepunkte, also kodiere vor dem Messen. len(text.encode('utf-8')) ist die Anzahl der UTF-8-Bytes, und ein anderer Codec an dieser Stelle ergibt eine andere Zahl — genau darum geht es.
  • JavaScript: .length zählt UTF-16-Einheiten und ist damit ebenfalls keine Byte-Zahl. new TextEncoder().encode(text).length ist die Anzahl der UTF-8-Bytes, im Browser wie in Node, und TextEncoder erzeugt ausschließlich UTF-8, es gibt also keinen Codec zu benennen.
  • Prüfe, in welcher Einheit deine Grenze geschrieben ist, bevor du überhaupt zählst. Manche Datenbanken deklarieren eine Spalte in Zeichen, andere in Bytes; ein HTTP-Header-Wert und eine Dateigröße sind Bytes; und eine für Menschen geschriebene Regel ist das, was das Feld „Zeichen“ anzeigt. Alles, was in Zeichen gemessen wird, steht schon oben; alles, was in Bytes gemessen wird, braucht eine kodierte Länge.

Wenn du eine Byte-Zahl hast, ist der Datengrößen-Umrechner der nächste Schritt: Er rechnet eine rohe Byte-Zahl gleichzeitig in beide Einheitensysteme um — das auf Tausenderpotenzen und das auf Zweierpotenzen — und zeigt, wie die Werkzeuge auf deinem Rechner dieselbe Größe jeweils melden. Diese Seite endet, wo die Kodierung beginnt; jener fängt bei einer Byte-Zahl an.

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 an einen Server 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.

Verwandte Werkzeuge

  • Datengrößen-Umrechner

    Keine der Zählungen hier ist eine Größe in Bytes — die entsteht erst, wenn der Text codiert ist. Steht diese Zahl einmal fest, liest jene Seite sie in dezimalen und binären Einheiten nebeneinander und sagt, wie jedes Betriebssystem sie nennen wird.

  • Regex-Tester

    Reguläre Ausdrücke testen — Treffer, Ersetzen, Teilen.

  • Text-Diff

    Zwei Texte vergleichen — jede geänderte Zeile und jedes Wort.

  • Unicode-Zeichen-Inspektor

    Sehen Sie genau, aus welchen Zeichen ein Text besteht.