Zeichenlängenrechner

Fügen Sie eine Zeichenkette ein, und das Tool gibt ihre Länge in vier verschiedenen Bedeutungen an, JavaScript-Stil .length (UTF-16-Codeeinheiten), Unicode-Codepunkte, Graphemcluster (was Benutzer als ein Zeichen wahrnehmen) und UTF-8-Bytes (was Ihre Datenbankspalte tatsächlich speichert). Diese Zahlen stimmen nicht überein für jede Zeichenkette mit Emojis, Flaggen oder kombinierenden Zeichen, und diese Diskrepanz ist die Quelle vieler Fehler.

Die vier Sinne der Zeichenlänge

  1. 1

    UTF-16-Codeeinheiten

    Was `str.length` in JavaScript zurückgibt. 1 für die meisten Zeichen, 2 für jeden Codepunkt über U+FFFF (Emojis, alte Schriften).

  2. 2

    Codepunkte

    Einer pro Unicode-Skalare. Emojis sind jeweils 1; ZWJ-Sequenzen sind mehrere.

  3. 3

    Graphemcluster

    Was ein Benutzer als "ein Zeichen" bezeichnet. `🇺🇸` sind 2 Codepunkte, aber 1 Graphem. `n̈` sind 2 Codepunkte, aber 1 Graphem.

  4. 4

    UTF-8-Bytes

    Was Ihre DB speichert. ASCII = 1 Byte jeweils; gängige europäische = 2; CJK = 3; die meisten Emojis = 4.

Beispiele

Zeichenkette JS .length Codepunkte Grapheme UTF-8-Bytes
hello 5 5 5 5
café 4 4 4 5
😀 2 1 1 4
🇺🇸 4 2 1 8
👨‍👩‍👧 (Familie) 8 5 1 18
n̈ (n + Diaeresis) 2 2 1 3

Warum die Zahlen unterschiedlich sind

JavaScript-Zeichenketten sind UTF-16, sodass ein Codepunkt über U+FFFF als Surrogatpaar gespeichert wird, zwei UTF-16-Codeeinheiten. "😀".length === 2. Benutzer mögen das nicht, weil sie 😀 als ein Zeichen betrachten.

Grapheme gehen weiter: eine Länderflagge sind zwei regionale Indikator-Codepunkte, die der Benutzer als eine Flagge sieht. "🇺🇸".length === 4 in JavaScript, was absurd erscheint, aber so ist es. Um über Grapheme zu iterieren, verwenden Sie Intl.Segmenter (modern), die grapheme-splitter-Bibliothek oder behandeln Sie es manuell.

UTF-8-Bytes: was Ihre Datenbank speichert

Für eine Spalte vom Typ VARCHAR(255):

  • In MySQL utf8 (tatsächlich: utf8mb3) sind die 255 Bytes. café benötigt 5 Bytes, sodass Sie 51 Kopien unterbringen können.
  • In MySQL utf8mb4 (echtes UTF-8, einschließlich Emojis) sind es immer noch Bytes, aber die Kodierung unterstützt 4-Byte-Sequenzen.
  • In Postgres VARCHAR(255) sind die 255 Zeichen (Codepunkte), nicht Bytes.
  • In SQL Server VARCHAR variiert je nach Sortierung; NVARCHAR zählt 2-Byte-UCS-2-Einheiten.

Wenn Sie Datenbankfelder nach der sichtbaren Zeichengrenze des Benutzers dimensionieren, verwenden Sie Bytes × 4 zur Sicherheit in UTF-8-Spalten, jedes Graphem benötigt potenziell bis zu 4 Bytes pro Codepunkt, wobei ZWJ-Sequenzen mehr hinzufügen.

Twitter-Stil Zeichen zählen

Twitter zählt einen Tweet nach einer benutzerdefinierten Regel: Codepunkte, aber Emojis und CJK-Ideogramme zählen als 2. Ein 100% ASCII-Tweet kann 280 Zeichen haben; ein Tweet mit 140 Emojis erreicht maximal 140 “Zeichen”.

SMS-Zählung: 160 Zeichen im GSM 7-Bit. Jedes Nicht-GSM-Zeichen (á, é, ñ, Emoji) wechselt die Kodierung zu UCS-2, und die Länge Ihrer Nachricht sinkt auf 70 Zeichen.

Praktische Anwendungen

  • Datenbankspalten-Dimensionierung, Überprüfen Sie die Byte-Anzahl, bevor Sie eine Migration schreiben.
  • API-Quota-Durchsetzung, Die meisten APIs zählen Bytes, nicht Zeichen.
  • Formularvalidierung, Zeigen Sie dem Benutzer eine genaue Zeichenzahl, die seinen Erwartungen entspricht (Grapheme).
  • Leistungs-Debugging, Warum iteriert dieses Regex langsam? Weil die Eingabe in Codeeinheiten 3x länger ist als in Graphemen.

Häufig gestellte Fragen

Dieses Emoji ist eine ZWJ-Sequenz, die mehrere Codepunkte kombiniert (z. B. ein Familien-Emoji sind 7 Codepunkte). Twitter zählt es nach der Regel für Unicode-Gewicht mit 2 Zeichen; Ihr Editor zeigt 1 Graphem. Beide sind technisch richtig, sie messen nur unterschiedliche Dinge.

In UTF-8-Datenbanken sollten Sie 4 Bytes pro erwartetes Zeichen zur Sicherheit einplanen. Ein 100-Zeichen (Graphem) Feld sollte VARCHAR(400) Bytes sein, oder wenn Ihre DB in Zeichen wie Postgres zählt, VARCHAR(100) mit der Zeichencodierung.

In JavaScript: es hängt von der Kompositionsform ab. NFC zusammengesetzt (U+00E1) hat die Länge 1; NFD zerlegt (U+0061 + U+0301) hat die Länge 2. Dasselbe sichtbare Zeichen, unterschiedliche Byte-Sequenzen.

Familien- und Berufs-Emojis sind lange ZWJ-Sequenzen. Schriftarten ohne vollständige Unterstützung rendern jeden Codepunkt als separates Glyph, sodass 👨‍💻 zu 👨+💻 wird. Ein Upgrade der Schriftart des Betriebssystems behebt das.

Verwandte Tools

Tool in anderen Sprachen verfügbar