Caractères, points de code et octets

Unicode attribue à chaque caractère de chaque écriture un numéro, le point de code, noté U+ suivi de chiffres hexadécimaux : A est U+0041, é U+00E9, l'euro U+20AC, le visage souriant U+1F600. Il y a plus d'un million de positions, dont environ 150 000 utilisées.

Le point de code doit ensuite devenir des octets. UTF-8, l'encodage du web, utilise un à quatre octets : un pour l'ASCII, deux pour les lettres accentuées, trois pour presque tout le reste, quatre pour les emoji et les symboles rares. UTF-16, utilisé par JavaScript, Java et Windows, utilise deux octets ou une paire de substitution de quatre.

C'est pourquoi la longueur d'une chaîne dépend de ce qu'on compte : "😀".length vaut 2 en JavaScript, le caractère occupe 4 octets en UTF-8 et à l'œil il n'y en a qu'un. Et une lettre accentuée peut être un seul point de code ou une lettre suivie d'un accent combinant : identiques à l'œil, différentes pour la machine.

Erreurs fréquentes

  • Couper une chaîne UTF-8 à un nombre fixe d'octets : on risque de couper un caractère en deux.
  • Compter les caractères avec .length en JavaScript : les emoji et les caractères hors du plan de base comptent double.
  • Comparer des textes sans les normaliser : un é précomposé et un e suivi d'un accent combinant diffèrent pour l'ordinateur.

Questions fréquentes

Quelle différence entre Unicode et UTF-8 ?

Unicode est la liste des caractères avec leur numéro ; UTF-8 est une manière d'écrire ces numéros en octets. Le même texte Unicode peut être enregistré en UTF-8, UTF-16 ou UTF-32.

Pourquoi vois-je des caractères bizarres comme é au lieu de é ?

Parce qu'un texte en UTF-8 est lu comme du Latin-1 : les deux octets de é, C3 A9, deviennent deux caractères distincts. Il suffit de déclarer le bon encodage.

Comment écrire un caractère Unicode en HTML ?

Avec une entité numérique : é en décimal ou é en hexadécimal. Si la page est en UTF-8, tu peux aussi saisir le caractère directement.

Comment fonctionne ce calcul

UTF-8 : jusqu'à U+007F un octet 0xxxxxxx ; jusqu'à U+07FF deux octets 110xxxxx 10xxxxxx ; jusqu'à U+FFFF trois octets 1110xxxx 10xxxxxx 10xxxxxx ; au-delà, quatre octets 11110xxx et trois de continuation. UTF-16 : jusqu'à U+FFFF une unité de 16 bits ; au-delà, on soustrait 0x10000 et les 20 bits se répartissent en deux substituts, 0xD800 + les 10 bits hauts et 0xDC00 + les 10 bas.