Caractères vs octets : pourquoi votre texte est plus grand que vous ne le pensez
Vous collez une chaîne qui ressemble à 100 caractères dans un champ avec une limite de 100 caractères, et elle est rejetée car trop longue. Comment? La réponse est qu'un caractère et un octet ne sont pas la même chose, et l'écart entre eux, invisible jusqu'à ce qu'il vous morde, est l'un des aspects les plus déroutants du travail avec du texte. Voici ce qui se passe réellement.
La distinction fondamentale
En ASCII simple, les lettres, chiffres et symboles courants anglais de base, un caractère équivaut exactement à un octet, donc les comptes correspondent et personne n'y pense. Mais le Web fonctionne sur UTF-8, un codage dans lequel les caractères extérieurs à cet ensemble de base prennent chacun plus d'un octet. Une lettre accentuée comme é fait deux octets. De nombreux caractères asiatiques font trois octets. Les emoji font généralement quatre octets. Ainsi, le nombre d'octets occupés par votre texte peut être beaucoup plus grand que le nombre de caractères que vous voyez, en fonction entièrement de la nature de ces caractères.
Pourquoi la taille des octets est importante
L'écart est important car de nombreuses limites sont définies en octets et non en caractères. Les champs de base de données sont souvent dimensionnés en octets, donc un champ contenant 100 octets ne peut contenir que 50 caractères s'il est multi-octets. Les charges utiles du réseau, les limites de taille des messages et les quotas de stockage sont mesurés en octets. Certaines API limitent le corps des requêtes en fonction de la taille en octets. C'est exactement pourquoi un texte qui semble bien en dessous d'une limite de caractères peut être rejeté car trop long, la limite était en octets et vos lettres accentuées ou emoji ont augmenté le nombre d'octets même si le nombre de caractères semblait correct.
Comment UTF-8 attribue les octets
UTF-8 est de par sa conception à largeur variable. Il code les lettres et les chiffres latins de base dans un seul octet chacun, ce qui permet de conserver le texte anglais brut compact et identique octet par caractère. Au-delà de cela, il utilise deux octets pour la plupart des caractères latins et grecs accentués, trois octets pour une large plage comprenant la plupart des caractères chinois, japonais et coréens, et quatre octets pour le reste, y compris la plupart des emoji et certaines écritures rares. Ainsi, une chaîne de 100 caractères peut occuper entre 100 et 400 octets selon son contenu. Un tweet d’emoji est bien plus lourd qu’un tweet de simples lettres.
La surprise des emojis
Les emoji méritent une mention spéciale car ils sont ceux qui causent le plus de confusion. La plupart des emoji font quatre octets en UTF-8, et certains, ceux construits en combinant plusieurs points de code, comme certains drapeaux ou variantes de tons chair, en ont encore plus. Ainsi, un seul emoji peut utiliser autant d’espace en octets que quatre caractères latins simples, et un emoji composé peut en utiliser bien plus. Un message visuellement court mais riche en emojis peut dépasser la limite d'octets de manière inattendue. Si vous avez déjà vu un court message rempli d’emojis rejeté, voici pourquoi.
Les plats pratiques à emporter
Lorsqu'une limite est définie en caractères, la plupart des publications sur les réseaux sociaux comptent les caractères. Lorsqu'une limite est définie en octets, de nombreux champs de base de données, API et protocoles comptent les octets et rappelez-vous que les accents et les emoji gonflent le nombre d'octets. Lorsque vous n'êtes pas sûr de ce qu'un système utilise et que votre texte contient autre chose que du simple ASCII, vérifiez la taille en octets pour être sûr. Voir les deux chiffres à la fois supprime les incertitudes et évite le rejet « mais cela semblait assez court ».