Aller au contenu principal
Encodage à largeur variable Unicode Standard 17.0 §3.9 RFC 3629

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

Taille d'unité de code Octets de 8 bits (1 octet)
Octets par valeur scalaire 1, 2, 3 ou 4 octets
Espace de code permis U+0000 à U+10FFFF Substituts U+D800–U+DFFF strictement exclus
Compatibilité ASCII Identité directe 1:1 Les octets 0x00–0x7F correspondent identiquement à l'ASCII
Boutisme / ordre des octets Non applicable Défini strictement comme octets séquentiels
Marque d'ordre des octets (BOM) Optionnelle (EF BB BF) Ni requise ni recommandée sur le web
Part de l'écosystème web 98 % et plus dans le monde Valeur par défaut universelle selon l'encodage WHATWG
Spécifications régissantes Unicode 18.0 / RFC 3629 Rend obsolètes les formes à 5 et 6 octets du RFC 2279

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.

Exemples prédéfinis :
3 Octets totaux
1 Point(s) de code
1 Cluster de graphèmes

Flux d'octets encodable

Octet 1 (Lead byte (1110xxxx, indicates 3 bytes))
0xE2
11100010
Déc : 226
Octet 2 (Continuation byte (10xxxxxx))
0x82
10000010
Déc : 130
Octet 3 (Continuation byte (10xxxxxx))
0xAC
10101100
Déc : 172
Séquence hexadécimale : E2 82 AC
Octets binaires : 11100010 10000010 10101100

Décomposition détaillée par point de code

€
EURO SIGN U+20AC (décimal 8364)
3 octets
Bits scalaires (16 bits) : 0010 0000 1010 1100
Bits UTF-8 placés : 11100010 10000010 10101100

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.

1

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.
2

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 :

Bits scalaires bruts : 0010 0000 1010 1100
Gabarit de 3 octets : 1110xxxx 10xxxxxx 10xxxxxx
Le gabarit fournit exactement 16 emplacements de bits variables (x) correspondant aux 16 bits de la valeur scalaire.
3

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 :

4 bits forts → Octet 1 0010
6 bits intermédiaires → Octet 2 000010
6 bits faibles → Octet 3 101100
4

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
5

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 :

✓ Le premier octet est 0xE2 (correspond à la plage E1..EC, EE..EF).
✓ Le deuxième octet est 0x82 (tombe nettement dans la plage de continuation valide 80..BF).
✓ Le troisième octet est 0xAC (tombe nettement dans la plage de continuation valide 80..BF).
Résultat : E2 82 AC (3 octets, représentation UTF-8 bien formée de €).

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.

A
1 Octet

Latin Capital Letter A

Point de code :
Hex UTF-8 : 41

Single-byte ASCII character. Encodes identically to ASCII (0x41).

é
2 Octets

Latin Small Letter E with Acute

Point de code :
Hex UTF-8 : C3 A9

2-byte European accented character.

€
3 Octets

Euro Sign

Point de code :
Hex UTF-8 : E2 82 AC

3-byte standard symbol and worked encoding demonstration.

∞
3 Octets

Infinity

Point de code :
Hex UTF-8 : E2 88 9E

3-byte mathematical operator.

中
3 Octets

CJK Unified Ideograph-4E2D (Zhong)

Point de code :
Hex UTF-8 : E4 B8 AD

3-byte East Asian ideograph.

ع
2 Octets

Arabic Letter Ain

Point de code :
Hex UTF-8 : D8 B9

2-byte Right-to-Left character demonstrating directional isolation (<bdi>).

𐂃
4 Octets

Linear B Ideogram B105 Equus (Horse)

Point de code :
Hex UTF-8 : F0 90 82 83

4-byte non-emoji historic archaeological character.

😀
4 Octets

Grinning Face

Point de code :
Hex UTF-8 : F0 9F 98 80

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.

Hex de la BOM UTF-8 : EF BB BF
Non recommandée sur le web

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/env empê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.

Fundamental Rule

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.

Interoperability

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.

Architecture

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.

Storage Standard

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.

Unicode Consortium

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).

IETF

RFC 3629: UTF-8 Transformation Format ↗

Standardizes UTF-8 as STD 63, restricting byte length to 4 octets and requiring shortest-form representations.

WHATWG

Encoding Living Standard (§4.2 UTF-8) ↗

Specifies browser decoding algorithms, error handling, and replacement character (U+FFFD) substitution rules.