Unicode donne à chaque caractère un numéro appelé point de code, noté U+0041 pour A. Il existe 1 114 112 points de code possibles, répartis en 17 plans de 65 536. Un encodage comme UTF-8 ou UTF-16 transforme les points de code en octets. Cherchez des caractères avec l'inspecteur de caractères Unicode et nettoyez du texte avec le normaliseur Unicode ; l'entrée du glossaire est Unicode.
UTF-8 en un tableau
UTF-8 est rétrocompatible avec l'ASCII (les 128 premiers points de code tiennent sur un octet, identique à l'ASCII), auto-synchronisant (on retrouve la limite d'un caractère à partir de n'importe quel octet) et c'est le choix par défaut du web. UTF-16 utilise 2 octets pour la plupart des caractères et une paire de substitution de deux unités de 2 octets pour les points de code au-delà de U+FFFF, comme les emoji.
| Plage de points de code | Octets | Schéma de bits |
|---|---|---|
| U+0000 → U+007F | 1 | 0xxxxxxx |
| U+0080 → U+07FF | 2 | 110xxxxx 10xxxxxx |
| U+0800 → U+FFFF | 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| U+10000 → U+10FFFF | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Exemples vérifiés
| Caractère | Point de code | UTF-8 (hex) | UTF-16 (hex) |
|---|---|---|---|
| A | U+0041 |
41 |
0041 |
| é | U+00E9 |
c3 a9 |
00e9 |
| € | U+20AC |
e2 82 ac |
20ac |
| 😀 | U+1F600 |
f0 9f 98 80 |
d83d de00 |
Un caractère, plusieurs points de code
épeut être un seul point de code (U+00E9) ou deux :eplus un accent aigu combinant (U+0301). Le texte paraît identique mais sa longueur est 1 ou 2, et une comparaison simple échoue. La normalisation convertit les deux dans une même forme : NFC compose, NFD décompose ; NFKC et NFKD uniformisent aussi les caractères de compatibilité (fidevientfi,²devient2).- Ce que l'on voit comme un seul caractère (un cluster de graphèmes) peut être formé de nombreux points de code : l'emoji famille compte 5 points de code reliés par des liaisons de largeur nulle et occupe 18 octets en UTF-8.
- La longueur d'une chaîne dépend de l'unité : octets, unités UTF-16, points de code ou graphèmes peuvent tous différer pour un même texte.
Mojibake et autres pièges
- Mojibake : des octets UTF-8 lus comme du Latin-1 transforment
naïveennaïve. Déclarez toujours l'encodage (<meta charset="utf-8">, un en-tête HTTP ou le réglage de l'éditeur). - Les caractères invisibles (espaces de largeur nulle, contrôles bidirectionnels) peuvent se cacher dans du texte copié et des identifiants ; repérez-les avec le détecteur de caractères invisibles.
- Sosies : le
аcyrillique n'est pas lealatin. Les noms de domaine règlent cela avec Punycode, voir Punycode. - Une marque d'ordre des octets UTF-8 (
EF BB BF) en début de fichier est permise, mais généralement indésirable.