UTF-8 (abréviation de l'anglais https://www.unicode.org/L2/Historical/wg20-n193-fss-utf.pdf. - ) est un codage de caractères informatiques conçu pour coder l’ensemble des caractères du « répertoire universel de caractères codés », initialement développé par l’ISO dans la norme internationale ISO/CEI 10646, aujourd’hui totalement compatible avec le standard Unicode, en restant compatible avec la norme ASCII limitée à l'anglais de base, mais très largement répandue depuis des décennies.
L'UTF-8 est utilisé par 82,2 % des sites web en ., 87,6 % en 2016., 90,5 % en 2017, 93,1 % en . et près de 95,2 % en . Par sa nature, UTF-8 est d'un usage de plus en plus courant sur Internet, et dans les systèmes devant échanger de l'information. Il s'agit également du codage le plus utilisé dans les systèmes GNU/Linux et compatibles pour gérer le plus simplement possible des textes et leurs traductions dans tous les systèmes d'écritures et tous les alphabets du monde.
Liens avec la norme internationale ISO/CEI 10646 et les standards Unicode et d'Internet vignette|Schéma détaillé de l'encodage UTF-8. Inclut la numérotation des bits et la position exacte de chaque bit. Ce système ne contient pas d'étiquettes localisées (appropriées à un usage international). UTF-8 est un « format de transformation » issu à l'origine des travaux pour la norme ISO/CEI 10646, c'est-à-dire que UTF-8 définit un codage pour tout point de code scalaire (caractère abstrait ou « non-caractère ») du répertoire du jeu universel de caractères codés (Universal Character Set, ou UCS). Ce répertoire est aujourd'hui commun à la norme ISO/CEI 10646 (depuis sa révision 1.) et au standard Unicode (depuis sa version 1.1).
UTF-8 est officiellement défini dans la norme ISO/CEI 10646 depuis son adoption dans un amendement publié en 1996. Il fut aussi décrit dans le standard Unicode et fait partie de ce standard depuis la version 3.0 publiée en 2000. En 1996 fut publiée la (« UTF-8, a transformation format of ISO 10646 ») dans le but de fournir une spécification accessible d'UTF-8 et d'entamer sa standardisation au sein de l'Internet Engineering Task Force (IETF). Cette RFC fut révisée en 1998 () puis finalement en 2003 (), cette dernière version faisant d'UTF-8 un des standards de l'internet (STD 63).
Description technique Techniquement, il s'agit de coder les caractères Unicode sous forme de séquences de un à quatre codets d'un octet chacun. La norme Unicode définit entre autres un ensemble (ou répertoire) de caractères. Chaque caractère est repéré dans cet ensemble par un index entier aussi appelé « point de code ». Par exemple le caractère « € » (euro) est le 8365 caractère du répertoire Unicode, son index, ou point de code, est donc 8364 (0x20AC), car on commence à compter à partir de 0.
Le répertoire Unicode peut contenir plus d'un million de caractères, ce qui est bien trop grand pour être codé par un seul octet (limité à des valeurs entre 0 et 255). La norme Unicode définit donc des méthodes standardisées pour coder et stocker cet index sous forme de séquence d'octets : UTF-8 est l'une d'entre elles, avec UTF-16, UTF-32 et leurs différentes variantes.
La principale caractéristique d'UTF-8 est qu'elle est rétro-compatible avec le standard ASCII, c'est-à-dire que tout caractère ASCII se code en UTF-8 sous forme d'un unique octet, identique au code ASCII. Par exemple « A » (A majuscule) a pour code ASCII 65 (0x41) et se code en UTF-8 par l'octet 65. Chaque caractère dont le point de code est supérieur à 127 (0x7F) (caractère non ASCII) se code sur 2 à . Le caractère « € » (euro) se code par exemple sur : 226, 130, et 172 (0xE2, 0x82 et 0xAC).
Description Le numéro (valeur scalaire) de chaque point de code dans le jeu universel de caractères est donné par la norme ISO/CEI 10646 qui assigne un point de code à chaque caractère valide, puis permet leur codage en leur attribuant une valeur scalaire identique au point de code ; cette norme est reprise dans le standard Unicode (qui utilise depuis la version 1.1 le même répertoire).
Tous les « points de code » (code points en anglais) de U+0000 à U+D7FF et de U+E000 à U+10FFFF sont représentables en UTF-8. Les points de code entre U+D800 et U+DFFF sont réservés au codage en UTF-16, donc les points de cette plage ne correspondent à aucun caractère de l'UCS.
Les points de code ayant une valeur scalaire de 0 à 127 (points de codes U+0000 à U+007F, attribués aux caractères du jeu codé sur 7 bits dans l'ASCII) sont codés sur un seul octet dont le bit de poids fort est nul.
Les autres points de code (attribués ou non à des caractères) ayant une valeur scalaire supérieure à 127 (sauf ceux auxquels sont attribués des « demi-codets » qui ne sont pas eux-mêmes des caractères) sont codés sur plusieurs octets ayant chacun leur bit de poids fort non nul : les bits de poids fort du premier octet de la séquence codée forment une suite de 1 de longueur égale au nombre total d'octets (au moins 2) utilisés pour la séquence entière suivie d'un 0 et les octets suivants nécessaires ont leurs deux bits de poids fort positionnés à 10.
+ Définition du nombre d'octets utilisés dans le codage (attention ce tableau de principe contient des séquences non valides) Caractères codés Représentation binaire UTF-8 Premier octet valide (hexadécimal) Signification U+0000 à U+007F 0ƀƀƀ·ƀƀƀƀ 00 à 7F 1 octet, codant jusqu’à 7 bits U+0080 à U+07FF 110ƀ·ƀƀƀƀ 10ƀƀ·ƀƀƀƀ C2 à DF 2 octets, codant jusqu’à 11 bits U+0800 à U+FFFF 1110·ƀƀƀƀ 10ƀƀ·ƀƀƀƀ 10ƀƀ·ƀƀƀƀ E0 à EF 3 octets, codant jusqu’à 16 bits U+10000 à U+10FFFF 1111·0ƀƀƀ 10ƀƀ·ƀƀƀƀ 10ƀƀ·ƀƀƀƀ 10ƀƀ·ƀƀƀƀ F0 à F7 4 octets, codant jusqu’à 21 bits 1111·0100 1000·ƀƀƀƀ 10ƀƀ·ƀƀƀƀ 10ƀƀ·ƀƀƀƀ F4
Ce principe pourrait être étendu jusqu’à huit octets pour un seul point de code (pour représenter des points de code comprenant jusqu’à 42 bits), mais la version normalisée actuelle d'UTF-8 pose la limite à quatreCependant sur cette page retraçant l’histoire du codage UTF-8 avant 1996, il est dit : « », faisant par là référence à l’ensemble des valeurs possibles (plus de deux milliards, codées sur 31 bits au maximum) dans son édition initiale (aujourd’hui obsolète) de la norme ISO/CEI 10646, cf. section Restrictions successives..
Le codage interdit la représentation des points de code réservés aux demi-codets (qui n'ont pas de valeur scalaire définie, afin de préserver la compatibilité avec UTF-16 qui ne permet pas non plus de les représenter). Il autorise cependant la représentation des points de code assignés à des non-caractères (alors même que leur présence est interdite dans un texte conforme).
Exemples + Exemples de codage UTF-8 Type Caractère Point de code(hexadécimal) Valeur scalaire Codage UTF-8 décimal binaire binaire hexadécimal Contrôle () [NUL] U+0000 0 0 00000000 00 [US] U+001F 31 1·1111 00011111 1F Texte (US-ASCII) [SP] U+0020 32 10·0000 00100000 20 0 U+0030 48 11·0000 00110000 30 9 U+0039 57 11·1001 00111001 39 ? U+003F 63 11·1111 00111111 3F @ U+0040 64 100·0000 01000000 40 A U+0041 65 100·0001 01000001 41 Z U+005A 90 101·1010 01011010 5A a U+0061 97 110·0001 01100001 61 z U+007A 122 111·1010 01111010 7A ~ U+007E 126 111·1110 01111110 7E Contrôle () [DEL] U+007F 127 111·1111 01111111 7F [PAD] U+0080 128 1000·0000 11000010 10000000 C2 80 [APC] U+009F 159 1001·1111 11000010 10011111 C2 9F Texte () [NBSP] U+00A0 160 1010·0000 11000010 10100000 C2 A0 ¿ U+00BF 191 1011·1111 11000010 10111111 C2 BF À U+00C0 192 1100·0000 11000011 10000000 C3 80 é U+00E9 233 1110·1001 11000011 10101001 C3 A9 ߿ U+07FF 2047 111 1111·1111 11011111 10111111 DF BF ࠀ U+0800 2048 1000 0000·0000 11100000 10100000 10000000 E0 A0 80 € U+20AC 10·0000 1010·1100 11100010 10000010 10101100 E2 82 AC U+D7FF 1101·0111 1111·1111 11101101 10011111 10111111 ED 9F BF Demi-codet U+D800 (néant) (codage interdit) U+DFFF Usage privé () [] U+E000 1110·0000 0000·0000 11101110 10000000 10000000 EE 80 80 [] U+F8FF 1111·1000 1111·1111 11101111 10100011 10111111 EF A3 BF Texte () U+F900 1111·1001 0000·0000 11101111 10100100 10000000 EF A4 80 ﷏ U+FDCF 1111·1101 1100·1111 11101111 10110111 10001111 EF B7 8F Non-caractères U+FDD0 1111·1101 1101·0000 11101111 10110111 10010000 EF B7 90 U+FDEF 1111·1101 1110·1111 11101111 10110111 10101111 EF B7 AF Texte () ﷰ U+FDF0 1111·1101 1111·0000 11101111 10110111 10110000 EF B7 B0 � U+FFFD 1111·1111 1111·1101 11101111 10111111 10111101 EF BF BD Non-caractères U+FFFE 1111·1111 1111·1110 11101111 10111111 10111110 EF BF BE U+FFFF 1111·1111 1111·1111 11101111 10111111 10111111 EF BF BF Texte () 𐀀 U+10000 1 0000·0000 0000·0000 11110000 10010000 10000000 10000000 F0 90 80 80 𝄞 U+1D11E 1 1101·0001 0001·1110 11110000 10011101 10000100 10011110 F0 9D 84 9E U+1FFFD 1 1111·1111 1111·1101 11110000 10011111 10111111 10111101 F0 9F BF BD Non-caractères U+1FFFE 1 1111·1111 1111·1110 11110000 10011111 10111111 10111110 F0 9F BF BE U+1FFFF 1 1111·1111 1111·1111 11110000 10011111 10111111 10111111 F0 9F BF BF Texte() 𠀀 U+20000 10 0000·0000 0000·0000 11110000 10100000 10000000 10000000 F0 A0 80 80 U+2FFFD 10 1111·1111 1111·1101 11110000 10101111 10111111 10111101 F0 AF BF BD Non-caractères U+2FFFE 10 1111·1111 1111·1110 11110000 10101111 10111111 10111110 F0 AF BF BE U+2FFFF 10 1111·1111 1111·1111 11110000 10101111 10111111 10111111 F0 AF BF BF Texte () 𰀀 U+30000 11 0000·0000 0000·0000 11110000 10110000 10000000 10000000 F0 B0 80 80 U+3FFFD 11 1111·1111 1111·1101 11110000 10111111 10111111 10111101 F0 BF BF BD Non-caractères U+3FFFE 11 1111·1111 1111·1110 11110000 10111111 10111111 10111110 F0 BF BF BE U+3FFFF 11 1111·1111 1111·1111 11110000 10111111 10111111 10111111 F0 BF BF BF ...autres plans réservés... Spécial () U+E0000 1110 0000·0000 0000·0000 11110011 10100000 10000000 10000000 F3 A0 80 80 U+EFFFD 1110 1111·1111 1111·1101 11110011 10101111 10111111 10111101 F3 AF BF BD Non-caractères U+EFFFE 1110 1111·1111 1111·1110 11110011 10101111 10111111 10111110 F3 AF BF BE U+EFFFF 1110 1111·1111 1111·1111 11110011 10101111 10111111 10111111 F3 AF BF BF Usage privé () [] U+F0000 1111 0000·0000 0000·0000 11110011 10110000 10000000 10000000 F3 B0 80 80 [] U+FFFFD 1111 1111·1111 1111·1101 11110011 10111111 10111111 10111101 F3 BF BF BD Non-caractères U+FFFFE 1111 1111·1111 1111·1110 11110011 10111111 10111111 10111110 F3 BF BF BE U+FFFFF 1111 1111·1111 1111·1111 11110011 10111111 10111111 10111111 F3 BF BF BF Usage privé () [] U+100000 1·0000 0000·0000 0000·0000 11110100 10000000 10000000 10000000 F4 80 80 80 [] U+10FFFD 1·0000 1111·1111 1111·1101 11110100 10001111 10111111 10111101 F4 8F BF BD Non-caractères U+10FFFE 1·0000 1111·1111 1111·1110 11110100 10001111 10111111 10111110 F4 8F BF BE U+10FFFF 1·0000 1111·1111 1111·1111 11110100 10001111 10111111 10111111 F4 8F BF BF
Caractéristiques Dans toute chaîne de caractères codée en UTF-8, on remarque que : tout octet de bit de poids fort nul désigne un unique « point de code » affecté à un caractère du répertoire de l'US-ASCII et codé sur ce seul octet, d'une valeur scalaire identique à celle du codet utilisé dans le codage US-ASCII ; tout octet de bits de poids fort valant 11 est le premier octet d'une séquence unique représentant un « point de code » (affecté à un caractère ou un non-caractère) et codé sur plusieurs octets ; tout octet de bits de poids fort valant 10 est un des octets suivants d'une séquence unique représentant un « point de code » (affecté à un caractère ou un non-caractère) et codé sur plusieurs octets ; aucun octet ne peut prendre une valeur hexadécimale entre C0 et C1, ni entre F5 et FF (le plus haut point de code valide et affecté à un caractère représentable est U+10FFFD ; c’est un caractère à usage privé alloué dans le valide).