3. UTF-8 definition (Définition d'UTF-8)
UTF-8 est défini par la norme Unicode [UNICODE]. Des descriptions et formules peuvent également être trouvées dans l'Annexe D d'ISO/IEC 10646-1 [ISO.10646].
Plage de codage (Encoding Range)
Dans UTF-8, les caractères de la plage U+0000..U+10FFFF (la plage accessible par UTF-16) sont codés en utilisant des séquences de 1 à 4 octets.
Séquences à un seul octet
Le seul octet d'une « séquence » de un a le bit d'ordre supérieur mis à 0, les 7 bits restants étant utilisés pour coder le numéro de caractère.
Séquences multi-octets
Dans une séquence de n octets, n>1 :
- L'octet initial a les n bits d'ordre supérieur mis à 1, suivis d'un bit mis à 0
- Les bits restants de cet octet contiennent des bits du numéro du caractère à coder
- Les octets suivants ont tous le bit d'ordre supérieur mis à 1 et le bit suivant mis à 0, laissant 6 bits dans chacun pour contenir des bits du caractère à coder
Tableau de codage (Encoding Table)
Le tableau ci-dessous résume le format de ces différents types d'octets. La lettre x indique les bits disponibles pour coder les bits du numéro de caractère.
Plage de numéros | Séquence d'octets UTF-8
de caractères | (binaire)
(hexadécimal) |
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Algorithme de codage (Encoding Algorithm)
Le codage d'un caractère en UTF-8 procède comme suit :
Étape 1 : Déterminer le nombre d'octets
Déterminer le nombre d'octets requis à partir du numéro de caractère et de la première colonne du tableau ci-dessus. Il est important de noter que les lignes du tableau sont mutuellement exclusives, c'est-à-dire qu'il n'y a qu'une seule façon valide de coder un caractère donné.
Étape 2 : Préparer les bits d'ordre supérieur
Préparer les bits d'ordre supérieur des octets selon la deuxième colonne du tableau.
Étape 3 : Remplir les bits de caractère
Remplir les bits marqués x à partir des bits du numéro de caractère, exprimés en binaire. Commencer par placer le bit de poids faible du numéro de caractère dans la position de poids faible du dernier octet de la séquence, puis placer le bit de poids supérieur suivant du numéro de caractère dans la position de poids supérieur suivante de cet octet, etc. Lorsque les bits x du dernier octet sont remplis, passer à l'avant-dernier octet, puis au précédent, etc. jusqu'à ce que tous les bits x soient remplis.
Plages de caractères réservées (Reserved Character Ranges)
La définition d'UTF-8 interdit le codage des numéros de caractères entre U+D800 et U+DFFF, qui sont réservés pour une utilisation avec la forme de codage UTF-16 (comme paires de substitution) et ne représentent pas directement des caractères.
Conversion depuis UTF-16
Lors du codage en UTF-8 à partir de données UTF-16, il est nécessaire de décoder d'abord les données UTF-16 pour obtenir les numéros de caractères, qui sont ensuite codés en UTF-8 comme décrit ci-dessus.
Comparaison avec CESU-8
Cela contraste avec CESU-8 [CESU-8], qui est un codage de type UTF-8 qui n'est pas destiné à être utilisé sur Internet. CESU-8 fonctionne de manière similaire à UTF-8 mais code les valeurs de code UTF-16 (quantités de 16 bits) au lieu du numéro de caractère (point de code). Cela conduit à des résultats différents pour les numéros de caractères supérieurs à 0xFFFF ; le codage CESU-8 de ces caractères n'est PAS un UTF-8 valide.
Algorithme de décodage (Decoding Algorithm)
Le décodage d'un caractère UTF-8 procède comme suit :
Étape 1 : Initialiser le nombre binaire
Initialiser un nombre binaire avec tous les bits mis à 0. Jusqu'à 21 bits peuvent être nécessaires.
Étape 2 : Déterminer les bits de caractère
Déterminer quels bits codent le numéro de caractère à partir du nombre d'octets dans la séquence et de la deuxième colonne du tableau ci-dessus (les bits marqués x).
Étape 3 : Distribuer les bits
Distribuer les bits de la séquence au nombre binaire, d'abord les bits de poids faible du dernier octet de la séquence et en procédant vers la gauche jusqu'à ce qu'il ne reste plus de bits x. Le nombre binaire est maintenant égal au numéro de caractère.
Exigence de sécurité (Security Requirement)
Les implémentations de l'algorithme de décodage ci-dessus doivent (MUST) protéger contre le décodage de séquences invalides.
Exemples de séquences invalides
Par exemple, une implémentation naïve peut :
- Décoder la séquence UTF-8 trop longue C0 80 en caractère U+0000
- Décoder la paire de substitution ED A1 8C ED BE B4 en U+233B4
Le décodage de séquences invalides peut avoir des conséquences sur la sécurité ou causer d'autres problèmes. Voir Considérations de sécurité (Section 10) ci-dessous.