Guides Développement

Comment fonctionnent Unicode et UTF-8

Points de code, plans et encodages expliqués : comment UTF-8 stocke les caractères sur 1 à 4 octets (avec un tableau vérifié), ce que sont les paires de substitution d'UTF-16, pourquoi é peut être un ou deux points de code et comment éviter le mojibake.

Dernière vérification :

AdSense Placeholder
Slot: header_reference_page
Sur cette page

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 : e plus 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é (fi devient fi, ² devient 2).
  • 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ïve en naï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 le a latin. 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.

Essayez ces outils

Voir aussi

  • Glossaire Unicode
    L'Unicode est la norme universelle qui donne à chaque caractère des écritures du monde, ainsi qu'aux symboles et emojis.
  • Glossaire UTF-8
    L'UTF-8 est l'encodage Unicode dominant : il écrit chaque caractère sur un à quatre octets et reste identique à l'ASCII pour les 128.
  • Glossaire ASCII
    L'ASCII est un encodage de caractères sur 7 bits qui attribue les nombres 0 à 127 aux lettres anglaises, chiffres.
  • Glossaire Punycode
    Le Punycode est l'encodage qui permet de stocker dans le DNS, limité à l'ASCII, des noms de domaine contenant des caractères non ASCII.
  • Glossaire Normalisation Unicode
    La normalisation Unicode convertit en une forme standard unique un texte qui peut s'écrire de plusieurs façons, comme une lettre accentuée.
  • Aide-mémoire Aide-mémoire de la table ASCII
    Les 95 caractères ASCII imprimables avec leur code décimal et hex.
  • Aide-mémoire Entités HTML
    Les entités HTML réellement utilisées, avec nom, code décimal et sens, les cinq caractères à échapper et le décodage des entités.

Questions fréquemment posées

Le fichier est en UTF-8 mais a été lu comme du Latin-1 (ou du Windows-1252). Chaque octet s'est affiché comme un caractère à part. Rouvrez-le en choisissant UTF-8 comme encodage.

AdSense Placeholder
Slot: footer_leaderboard