Calculateur de longueur de chaîne

Collez une chaîne et l’outil indique sa longueur selon quatre sens différents, style JavaScript .length (unités de code UTF-16), points de code Unicode, clusters de graphèmes (ce que les utilisateurs perçoivent comme un caractère), et octets UTF-8 (ce que votre colonne de base de données stocke réellement). Ces chiffres ne s’accordent pas pour toute chaîne contenant des emoji, des drapeaux ou des marques combinantes, et ce désaccord est la source de nombreux bugs.

Les quatre sens de la longueur de chaîne

  1. 1

    Unités de code UTF-16

    Ce que `str.length` retourne en JavaScript. 1 pour la plupart des caractères, 2 pour tout point de code au-delà de U+FFFF (emoji, scripts anciens).

  2. 2

    Points de code

    Un par scalaire Unicode. Les emoji comptent pour 1 chacun ; les séquences ZWJ sont multiples.

  3. 3

    Clusters de graphèmes

    Ce qu'un utilisateur appelle "un caractère". `🇺🇸` est 2 points de code mais 1 graphème. `n̈` est 2 points de code mais 1 graphème.

  4. 4

    Octets UTF-8

    Ce que votre base de données stocke. ASCII = 1 octet chacun ; européen commun = 2 ; CJK = 3 ; la plupart des emoji = 4.

Exemples

Chaîne JS .length Points de code Graphèmes Octets UTF-8
hello 5 5 5 5
café 4 4 4 5
😀 2 1 1 4
🇺🇸 4 2 1 8
👨‍👩‍👧 (famille) 8 5 1 18
n̈ (n + tréma) 2 2 1 3

Pourquoi les chiffres diffèrent

Les chaînes JavaScript sont en UTF-16, donc un point de code au-dessus de U+FFFF est stocké comme une paire de substitution, deux unités de code UTF-16. "😀".length === 2. Les utilisateurs détestent cela car ils pensent à 😀 comme un seul caractère.

Les graphèmes vont plus loin : un drapeau national est deux points de code d’indicateur régional que l’utilisateur voit comme un seul drapeau. "🇺🇸".length === 4 en JavaScript, ce qui semble absurde, mais c’est comme ça. Pour itérer sur les graphèmes, utilisez Intl.Segmenter (moderne), la bibliothèque grapheme-splitter, ou gérez manuellement.

Octets UTF-8 : ce que votre base de données stocke

Pour une colonne typée VARCHAR(255) :

  • Dans MySQL utf8 (réel : utf8mb3), les 255 sont des octets. café prend 5 octets, donc vous pouvez y mettre 51 copies.
  • Dans MySQL utf8mb4 (vrai UTF-8, inclut les emoji), c’est toujours des octets mais l’encodage supporte les séquences de 4 octets.
  • Dans Postgres VARCHAR(255), les 255 sont des caractères (points de code), pas des octets.
  • Dans SQL Server VARCHAR, varie selon le tri ; NVARCHAR compte les unités UCS-2 de 2 octets.

Si vous dimensionnez les champs de base de données par limite de caractères visibles par l’utilisateur, utilisez des octets × 4 pour la sécurité dans les colonnes UTF-8, chaque graphème peut potentiellement prendre jusqu’à 4 octets par point de code, avec des séquences ZWJ ajoutant plus.

Comptage de caractères à la Twitter

Twitter compte un tweet selon une règle personnalisée : points de code, mais les emoji et les idéogrammes CJK comptent pour 2. Un tweet 100% ASCII peut avoir 280 caractères ; un tweet avec 140 emoji atteint un maximum de 140 “caractères”.

Comptage SMS : 160 caractères en GSM 7 bits. Tout caractère non-GSM (á, é, ñ, emoji) change l’encodage en UCS-2, et la longueur de votre message tombe à 70 caractères.

Utilisations pratiques

  • Dimensionnement de colonne de base de données, vérifiez le compte d’octets avant d’écrire une migration.
  • Application des quotas API, la plupart des API comptent les octets, pas les caractères.
  • Validation de formulaire, montrez à l’utilisateur un compte de caractères précis qui correspond à ses attentes (graphèmes).
  • Débogage de performance, pourquoi cette regex itère-t-elle lentement ? Parce que l’entrée est 3x plus longue en unités de code qu’en graphèmes.

Questions fréquentes

Cet emoji est une séquence ZWJ combinant plusieurs points de code (par exemple, un emoji de famille est 7 points de code). Twitter le compte comme 2 caractères selon la règle de poids Unicode ; votre éditeur montre 1 graphème. Les deux sont techniquement corrects, ils mesurent juste des choses différentes.

Dans les bases de données UTF-8, prévoyez 4 octets par caractère attendu pour la sécurité. Un champ de 100 caractères (graphème) devrait être VARCHAR(400) octets, ou si votre base de données compte en caractères comme Postgres, VARCHAR(100) avec la gestion du jeu de caractères.

En JavaScript : cela dépend de la forme de composition. NFC composé (U+00E1) a une longueur de 1 ; NFD décomposé (U+0061 + U+0301) a une longueur de 2. Même caractère visible, séquences d’octets différentes.

Les emoji de famille et de profession sont de longues séquences ZWJ. Les polices sans support complet rendent chaque point de code comme un glyphe séparé, donc 👨‍💻 devient 👨+💻. Mettre à jour la police du système d’exploitation le corrige.

Outils similaires

Outil disponible dans d’autres langues