Longueur de texte
Mesure une chaîne de plusieurs façons utiles à la fois, y compris les emojis et l’hébreu.
Pourquoi « quelle est la longueur de ce texte ? » a plusieurs réponses
Cela semble une question triviale, mais la longueur d’un texte dépend entièrement de ce que vous comptez. Une personne compte les caractères qu’elle voit. Une base de données compte l’espace de stockage qu’occupe une valeur. JavaScript compte encore autre chose. Quand ces nombres divergent — et c’est souvent le cas pour les emojis, les lettres accentuées et les écritures non latines — une seule « longueur » est trompeuse. Cet outil affiche cinq mesures utiles côte à côte pour que vous choisissiez celle qui compte dans votre cas.
Les cinq mesures expliquées
- Caractères (graphèmes) : ce qu’un humain perçoit comme un caractère. Un emoji de famille comme 👨👩👧, ou une lettre avec un accent combinant, compte pour un — c’est le décompte qui correspond « à l’œil ».
- Points de code (code points) : le nombre de valeurs scalaires Unicode. Un seul caractère visible peut être formé de plusieurs points de code assemblés, si bien que ce nombre est souvent plus élevé que celui des graphèmes.
- Unités UTF-16 : la valeur que JavaScript renvoie via la propriété .length d’une chaîne. Les caractères hors du Plan multilingue de base (la plupart des emojis) occupent deux unités UTF-16 chacun.
- Mots : le nombre de jetons de type mot, détectés de façon compatible Unicode plutôt qu’en découpant naïvement sur les espaces.
- Lignes : le nombre de lignes, en comptant chaque saut de ligne.
Pourquoi les emojis et les accents cassent le comptage naïf
Le texte moderne est construit avec Unicode, qui représente de nombreux caractères visibles comme des séquences plutôt que des unités uniques. Un emoji de drapeau, c’est deux symboles indicateurs régionaux. Un emoji de famille, c’est plusieurs figures reliées par des caractères invisibles de « liaison de largeur nulle ». Un é accentué peut être un seul point de code, ou un e simple suivi d’un accent combinant. Chacun ressemble à un caractère mais peut compter pour deux, trois ou plus selon la mesure. C’est précisément pourquoi compter à la main, ou se fier à un seul nombre, mène à des bugs.
Quel décompte utiliser ?
- Limites de caractères vues par les gens (une bio, un champ de type tweet, un aperçu SMS) : utilisez Caractères (graphèmes), car cela correspond à ce que compte l’utilisateur.
- Manipulation de chaînes en JavaScript, indexation ou découpage : utilisez les unités UTF-16, puisque c’est sur elles que reposent .length et les index de chaîne.
- Tailles de colonnes de base de données : vérifiez si votre colonne se mesure en caractères ou en octets — beaucoup sont limitées en octets, et les octets UTF-8 diffèrent encore de tous ces décomptes.
- Comptes de mots ou de lignes pour les éditeurs et la lisibilité : utilisez les mesures Mots et Lignes.
Questions fréquentes
- Quel décompte correspond à la longueur de chaîne de JavaScript ?
- La valeur des unités UTF-16 correspond à la propriété .length brute de JavaScript. Si votre code découpe ou indexe des chaînes, c’est ce nombre qui régit son comportement.
- Pourquoi un emoji compte-t-il pour plusieurs caractères ?
- De nombreux emojis sont composés de plusieurs points de code Unicode assemblés. En tant que graphème (ce que vous voyez), c’est un caractère, mais ses décomptes de points de code et d’UTF-16 sont plus élevés, c’est pourquoi chaque mesure est affichée séparément.
- Compte-t-il les espaces et sauts de ligne finaux ?
- Oui. Chaque caractère que vous collez est compté, y compris les espaces de début et de fin et les sauts de ligne. Si les totaux semblent plus élevés que prévu, vérifiez la présence d’espaces finaux invisibles.
- Mon texte est-il envoyé quelque part ?
- Non. Tout le comptage se fait dans votre navigateur. Le texte que vous saisissez ou collez ne quitte jamais votre appareil.
- Qu’est-ce qu’un graphème ?
- Un graphème, ou « groupe de graphèmes », est un caractère tel que l’utilisateur le perçoit — la plus petite unité qu’un lecteur appellerait un seul caractère, même si elle est formée de plusieurs points de code.
- En quoi les octets diffèrent-ils de ces décomptes ?
- Les octets dépendent de l’encodage. En UTF-8, une lettre ASCII fait un octet, la plupart des caractères accentués et non latins deux ou trois, et beaucoup d’emojis quatre. Aucune des cinq mesures ici n’est un décompte d’octets, donc pour les champs limités en octets, encodez d’abord en UTF-8.