Encodage de caractères UTF-8
UTF-8 (format de transformation Unicode de 8 bits) est l'encodage de caractères à largeur variable le plus utilisé du web et des systèmes informatiques modernes. Il encode chaque valeur scalaire Unicode valide (U+0000 à U+D7FF et U+E000 à U+10FFFF) en séquences d'un à quatre octets de 8 bits, tout en maintenant une compatibilité ascendante parfaite avec l'ASCII 7 bits et en interdisant strictement les points de code substituts et les représentations d'octets trop longues.
Données techniques rapides
U+0000 à U+10FFFF
Substituts U+D800–U+DFFF strictement exclus
EF BB BF)
Ni requise ni recommandée sur le web
Disposition des bits et distribution des octets UTF-8
Conformément à la section 3.9 d'Unicode 18.0 (tableau 3-6), les valeurs scalaires Unicode sont mappées en 1 à 4 octets à l'aide de gabarits binaires de bits sans préfixe. Le nombre de bits 1 de poids fort de l'octet de tête annonce directement la longueur totale de la séquence, tandis que tous les octets de continuation commencent par le préfixe fixe 10xxxxxx.
| Longueur | Plage de valeurs scalaires | Octet 1 (tête) | Octet 2 (continuation) | Octet 3 (continuation) | Octet 4 (continuation) | Hex de l'octet de tête | Capacité |
|---|---|---|---|---|---|---|---|
| 1 Octet |
U+0000–U+007F
|
0xxxxxxx |
— | — | — | 00–7F |
128 |
| 2 Octets |
U+0080–U+07FF
|
110xxxxx |
10xxxxxx
|
— | — | C2–DF |
1,920 |
| 3 Octets |
U+0800–U+FFFF (excl. surrogates)
|
1110xxxx |
10xxxxxx
|
10xxxxxx
|
— | E0–EF |
61,440 |
| 4 Octets |
U+10000–U+10FFFF
|
11110xxx |
10xxxxxx
|
10xxxxxx
|
10xxxxxx
|
F0–F4 |
1,048,576 |
Architecture sans préfixe et auto-synchronisation
Comme les octets de continuation ont toujours le motif de bits 10xxxxxx (hex 0x80–0xBF), ils ne peuvent jamais être confondus avec de l'ASCII mono-octet (0xxxxxxx, hex 0x00–0x7F) ni avec des octets de tête multioctets (11xxxxxx, hex 0xC2–0xF4). Un décodeur de flux peut reprendre à n'importe quel octet aléatoire et rechercher de manière fiable, en avant ou en arrière, la prochaine limite de caractère en 3 vérifications d'octets au maximum, sans perte d'état.
Inspecteur de bits UTF-8 interactif et validateur d'octets
Inspectez en temps réel les allocations de bits de n'importe quel texte, ou validez directement des séquences d'octets hexadécimaux brutes par rapport aux contraintes du tableau 3-7 d'Unicode 18.0.
Flux d'octets encodable
E2 82 AC
11100010 10000010 10101100
Décomposition détaillée par point de code
0010 0000 1010 1100
11100010 10000010 10101100
e282ac ou 0xE2 0x82 0xAC).
Séquence UTF-8 bien formée
Conforme au tableau 3-7 d'Unicode 18.0
La séquence d'octets E2 82 AC représente 1 caractère bien formé : € (EURO SIGN, U+20AC). L'octet de tête 0xE2 est correctement suivi de deux octets de continuation dans la plage valide 80..BF.
Exemple résolu : encodage du symbole euro (€)
Suivez l'algorithme bit à bit exact exigé par le standard Unicode 18.0 pour encoder le signe monétaire euro € (U+20AC) dans sa représentation UTF-8 canonique de 3 octets.
Identifier la valeur scalaire Unicode et déterminer la longueur en octets
Le signe euro a pour valeur scalaire U+20AC (décimal 8,364). En vérifiant le tableau 3-6 :
U+0800 ≤ U+20AC ≤ U+FFFF → Nécessite une séquence UTF-8 de 3 octets. Récupérer la représentation binaire et le gabarit UTF-8 de 3 octets
Convertissez 0x20AC en 16 bits binaires et préparez le gabarit de préfixe de 3 octets :
0010 0000 1010 1100
1110xxxx 10xxxxxx 10xxxxxx
x) correspondant aux 16 bits de la valeur scalaire.
Répartir les bits scalaires dans les emplacements du gabarit
Partitionnez les 16 bits scalaires de droite à gauche en charges utiles de 6 bits et 4 bits :
0010
000010
101100
Assembler les octets finaux et convertir en hexadécimal
| Position | Préfixe | Charge utile | Binaire complet | Hexadécimal | Décimal |
|---|---|---|---|---|---|
| Octet 1 (tête) | 1110 |
0010 |
11100010 |
0xE2 | 226 |
| Octet 2 (continuation) | 10 |
000010 |
10000010 |
0x82 | 130 |
| Octet 3 (continuation) | 10 |
101100 |
10101100 |
0xAC | 172 |
Contrôle de validation par rapport au tableau 3-7 d'Unicode 18.0
Vérifiez par rapport aux contraintes normatives pour les octets de tête E0..EF :
0xE2 (correspond à la plage E1..EC, EE..EF).
0x82 (tombe nettement dans la plage de continuation valide 80..BF).
0xAC (tombe nettement dans la plage de continuation valide 80..BF).
Exemples représentatifs de caractères UTF-8
Explorez comment différents caractères Unicode, diacritiques combinants et séquences composites sont mappés en flux d'octets de 1, 2, 3, 4 octets ou multi-points de code.
Latin Capital Letter A
Single-byte ASCII character. Encodes identically to ASCII (0x41).
Latin Small Letter E with Acute
2-byte European accented character.
Euro Sign
3-byte standard symbol and worked encoding demonstration.
Infinity
3-byte mathematical operator.
CJK Unified Ideograph-4E2D (Zhong)
3-byte East Asian ideograph.
Arabic Letter Ain
2-byte Right-to-Left character demonstrating directional isolation (<bdi>).
Linear B Ideogram B105 Equus (Horse)
4-byte non-emoji historic archaeological character.
Grinning Face
4-byte emoji scalar value encoded directly as a 4-octet sequence.
Critères de bonne formation (tableau 3-7 d'Unicode 18.0)
Toutes les séquences correspondant aux gabarits généraux de bits du tableau 3-6 ne sont pas du UTF-8 légal. Pour prévenir les exploits de sécurité par séquences trop longues et la corruption par substituts, le standard Unicode impose les contraintes normatives du tableau 3-7. Toute séquence d'octets s'écartant de ces plages exactes est mal formée et doit être rejetée par les décodeurs conformes.
| Plage de valeurs scalaires | 1er octet | 2e octet | 3e octet | 4e octet | Justification de la contrainte normative |
|---|---|---|---|---|---|
U+0000..U+007F |
00..7F |
— |
— |
— |
Standard 7-bit ASCII range. |
U+0080..U+07FF |
C2..DF |
80..BF |
— |
— |
C0..C1 prohibited to prevent overlong encoding. |
U+0800..U+0FFF |
E0 |
A0..BF |
80..BF |
— |
Second byte starts at A0 to avoid overlong U+0000..U+07FF. |
U+1000..U+CFFF |
E1..EC |
80..BF |
80..BF |
— |
Standard BMP range. |
U+D000..U+D7FF |
ED |
80..9F |
80..BF |
— |
Second byte capped at 9F to exclude surrogate code points (U+D800..U+DFFF). |
U+E000..U+FFFF |
EE..EF |
80..BF |
80..BF |
— |
BMP post-surrogate range. |
U+10000..U+3FFFF |
F0 |
90..BF |
80..BF |
80..BF |
Second byte starts at 90 to avoid overlong BMP encoding. |
U+40000..U+FFFFF |
F1..F3 |
80..BF |
80..BF |
80..BF |
Planes 4 through 15. |
U+100000..U+10FFFF |
F4 |
80..8F |
80..BF |
80..BF |
Second byte capped at 8F to enforce U+10FFFF maximum scalar limit. |
Élimination des séquences trop longues
Dans les premiers brouillons (et le RFC 2044), les décodeurs pouvaient accepter des représentations redondantes de caractères, comme 0xC0 0xAF pour / (ASCII 0x2F). Des charges malveillantes contournaient les pare-feu en encodant ../ ou <script> en formes de 2 ou 3 octets. Sous le tableau 3-7, les octets de tête C0 et C1 sont universellement interdits, et les deuxièmes octets pour E0 et F0 commencent strictement à A0 et 90 respectivement.
Interdiction absolue des substituts
Les valeurs scalaires Unicode sont explicitement définies comme des points de code excluant la plage des substituts hauts et bas (U+D800 à U+DFFF). Comme les substituts n'existent que comme mécanisme 16 bits pour UTF-16, l'octet de tête 0xED restreint les deuxièmes octets à 80..9F. Les deuxièmes octets A0..BF coderaient des substituts et sont strictement illégaux en UTF-8.
Séquences mal formées et sécurité des décodeurs
Une sécurité robuste exige que les décodeurs échouent sans danger face à des motifs d'octets non conformes. En décodant des entrées non fiables, les décodeurs ne doivent jamais interpréter des séquences mal formées comme des caractères valides ni supprimer silencieusement des octets illégaux.
| Vecteur de test (hex) | Classification de l'erreur | Séquence / valeur visée | Explication selon la norme | Risque de vulnérabilité de sécurité | Action |
|---|---|---|---|---|---|
C0 AF |
OVERLONG_ENCODING | ASCII Slash / (U+002F) | Illegal 2-byte representation for an ASCII character. Must be encoded in 1 byte (0x2F). Historical security risk in path traversal filter bypasses. | Filter evasion | |
E0 80 AF |
OVERLONG_ENCODING | Non-shortest BMP representation | Illegal 3-byte form representing a code point below U+0800. Second byte must be A0–BF when lead byte is E0. | Parser confusion | |
ED A0 80 |
SURROGATE_ENCODING | High Surrogate U+D800 | UTF-8 is prohibited from encoding surrogate code points (U+D800–U+DFFF). Surrogates exist exclusively for UTF-16 pair mechanics. | Invalid scalar insertion | |
F4 90 80 80 |
OUT_OF_RANGE | Above Maximum (U+110000) | Exceeds the 21-bit Unicode codespace boundary (U+10FFFF). Modern UTF-8 strictly rejects values above U+10FFFF. | Memory buffer overflow | |
E2 82 |
TRUNCATED_SEQUENCE | Truncated Euro Sign | Lead byte E2 announces a 3-byte sequence, but stream terminates after 2 bytes. Decoders must emit U+FFFD replacement character. | Data truncation | |
80 |
INVALID_CONTINUATION | Orphaned Continuation Byte | Continuation byte 0x80 (10000000) encountered without a preceding lead byte. | Stream desynchronization |
⚠️ Politique du caractère de remplacement (U+FFFD)
Selon le standard Unicode §5.22 et le standard d'encodage du WHATWG, quand une séquence d'octets mal formée est rencontrée dans un flux de texte, les décodeurs conformes doivent substituer chaque sous-partie maximale d'une sous-séquence mal formée par exactement un caractère de remplacement (U+FFFD REPLACEMENT CHARACTER).
Les décodeurs ne doivent jamais supprimer silencieusement des octets invalides, car cela peut concaténer des caractères auparavant inoffensifs en chaînes d'exploit dangereuses (ex. convertir s<C0 AF>cript en script).
🔒 Contournement des pare-feu d'applications web (WAF)
Des vulnérabilités historiques (comme le parcours de répertoires IIS CVE-2000-0884) sont survenues parce que les filtres de sécurité inspectaient les représentations ASCII des chaînes avant normalisation, tandis que les systèmes dorsaux décodaient des octets UTF-8 trop longs comme C0 AF en /.
L'application stricte du tableau 3-7 à la frontière immédiate du protocole prévient complètement tous les contournements par formes non minimales.
Sémantique de la marque d'ordre des octets (BOM) en UTF-8
Dans les encodages 16 et 32 bits (UTF-16 et UTF-32), la marque d'ordre des octets (U+FEFF) est nécessaire pour déterminer le boutisme du processeur (Big-Endian ou Little-Endian). En UTF-8, cependant, les unités de code sont strictement des octets de 8 bits, ce qui rend le boutisme des octets totalement dénué de sens.
EF BB BF
Où la BOM apparaît
Certains utilitaires Windows (comme le Bloc-notes classique de Windows) insèrent les trois octets EF BB BF au tout début d'un fichier comme signature pour différencier l'UTF-8 des pages de codes ANSI héritées (comme Windows-1252).
Pourquoi la BOM provoque des échecs
- Rompt le shebang POSIX : une BOM avant
#!/usr/bin/envempêche le noyau de reconnaître les scripts exécutables. - Violation de la norme JSON : le RFC 8259 §8.1 interdit strictement une BOM initiale dans du texte JSON.
- Envoi prématuré d'en-têtes HTTP : en PHP et dans les scripts serveur, une BOM passée inaperçue envoie une sortie avant les appels à
header(), déclenchant les avertissements fatals « headers already sent ». - Incompatibilités d'outils en ligne de commande : les utilitaires Unix (
grep,cat,awk) peuvent traiter la BOM comme du contenu littéral sur la première ligne.
Conseils officiels (Unicode et W3C)
Standard Unicode 18.0 §3.10 : « L'usage d'une BOM sur du texte UTF-8 n'est ni requis ni recommandé pour l'échange... Les systèmes ne doivent pas exiger une BOM sur du texte UTF-8. » Les serveurs web et protocoles modernes devraient déclarer l'encodage via les en-têtes HTTP (Content-Type: text/html; charset=utf-8) ou les balises meta HTML plutôt que de dépendre de signatures BOM.
Concepts clés et considérations d'ingénierie
Maîtriser UTF-8 exige de distinguer les octets de stockage, les points de code abstraits et les caractères perçus par l'utilisateur selon les langages de programmation.
Byte vs. Code Point vs. Grapheme Cluster
A code point is an abstract Unicode integer (e.g. U+20AC). A byte is an 8-bit storage unit. A user-perceived character (grapheme cluster) can span multiple code points and bytes. Never assume 1 byte equals 1 character.
ASCII Identity Mapping
The first 128 Unicode code points (U+0000 through U+007F) encode into identical single-byte values (0x00 through 0x7F). Any valid 7-bit ASCII stream is identical, valid UTF-8.
UTF-8 vs. Unicode
Unicode is the universal repertoire and numbered catalog of characters. UTF-8 is the mathematical serialization algorithm that encodes those numbers into physical bytes.
UTF-8 BOM Semantics
The byte sequence EF BB BF (UTF-8 encoding of U+FEFF) functions strictly as an optional file format signature. Because UTF-8 operates on single 8-bit octets, endianness is not applicable. UTF-8LE and UTF-8BE do not exist.
Normes de référence et citations normatives
Les définitions, algorithmes de bits et critères de validation de cette page dérivent directement des spécifications formelles régissantes.
The Unicode Standard 17.0, Chapter 3 (§3.9) ↗
Defines conformance requirement D92 (UTF-8 encoding form), Table 3-6 (bit distribution), and Table 3-7 (well-formed byte sequences).
RFC 3629: UTF-8 Transformation Format ↗
Standardizes UTF-8 as STD 63, restricting byte length to 4 octets and requiring shortest-form representations.
Encoding Living Standard (§4.2 UTF-8) ↗
Specifies browser decoding algorithms, error handling, and replacement character (U+FFFD) substitution rules.