UTF-8
UTF-8 (UCS transformation format 8 bits) est un format de codage de caractères défini pour les caractères Unicode (UCS). Chaque caractère est codé sur une suite de un à quatre octets.
UTF-8 est standardisé dans la RFC 3629 (UTF-8, a transformation format of ISO 10646). Le codage est aussi défini dans le rapport technique 17 de la norme. L'IETF requiert qu'UTF-8 soit supporté par les protocoles de communication d'Internet échangeant du texte.
| Sommaire |
Description
Le numéro de chaque caractère est donné par le standard Unicode.
Les caractères de numéro 0 à 127 sont codés sur un octet dont le bit de poids fort est toujours nul.
Les caractères de numéro supérieur à 127 sont codés sur plusieurs octets. Les bits de poids fort du premier octet forment une suite de 1 de longueur égale au nombre d'octets utilisés pour coder le caractère, les octets suivant ayant 10 comme bits de poids fort.
| 0vvvvvvv | 1 octet codant 1 à 7 bits |
| 110vvvvv 10vvvvvv | 2 octets codant 8 à 11 bits |
| 1110vvvv 10vvvvvv 10vvvvvv | 3 octets codant 12 à 16 bits |
| 11110vvv 10vvvvvv 10vvvvvv 10vvvvvv | 4 octets codant 17 à 21 bits |
Dans toute suite de caractères UTF-8, on remarque que :
- tout octet de bit de poids fort nul code un caractère US-ASCII sur un octet ;
- tout octet de bits de poids fort valant 11 est le premier octet d'un caractère codé sur plusieurs octets ;
- tout octet de bits de poids fort valant 10 est à l'intérieur d'un caractère codé sur plusieurs octets.
Ce principe pourrait être étendu jusqu'à six octets pour un caractère, mais UTF-8 pose la limite à quatre. Ce principe permet également d'utiliser plus d'octets que nécessaire pour coder un caractère, mais UTF-8 l'interdit.
Exemples pratiques
| caractère | code numérique | octets UTF-8 |
|---|---|---|
| A | 65 | 01000001 |
| é | 233 | 11000011 10101001 |
| € | 8364 | 11100010 10000010 10101100 |
| 𝄞 | 119070 | 11110000 10011101 10000100 10011110 |
Avantages
- Universalité : Ce codage, contrairement à d'autres comme la série ISO 8859, permet de représenter des milliers de caractères de toutes sortes de langues.
- Compatibilité : Un texte en US-ASCII est codé identiquement en UTF-8.
- Efficacité : Pour les langues utilisant beaucoup les caractères US-ASCII, UTF-8 nécessite moins de mémoire que l'UTF-16 ou l'UTF-32.
- Réutilisabilité : De nombreuses techniques de programmation informatique valables avec les caractères uniformément codés sur un octet le restent avec UTF-8, notamment :
- la manière de répérer la fin d'une chaîne de caractères C, car l'octet 00000000 est toujours le caractère nul.
- la manière de trouver une sous-chaîne est identique.
- Fiabilité : Il s'agit d'un codage auto-synchronisant (en lisant un seul octet on sait si c'est le premier d'un caractère ou non).
- Une séquence décrivant un caractère n'apparaît jamais dans une séquence plus longue décrivant un autre caractère (cas de Shift-JIS).
- Il n'existe pas de code « d'échappement » changeant l'interprétation de la suite d'une séquence d'octets.
Inconvénients
Un caractère UTF-8 a une taille variable, ce qui rend certaines opérations sur les chaînes plus compliquées : calcul du nombre de caractères, positionnement à une distance donnée dans un fichier texte, et en règle générale toute opération nécessitant l'accès au caractère de position N dans une chaîne.
Les idéogrammes (kanji, par exemple) utilisent 3 octets en UTF-8 contre 2 octets en UTF-16. Les textes chinois, coréens et japonais y occupent donc plus de place.
Un programme mal écrit peut accepter un certain nombre de représentations UTF-8 et les convertir comme un seul et même caractère. Ceci pose un problème de sécurité, en effet l'analyseur syntaxique peut avoir besoin de rejeter une certaine chaîne de caractères, par exemple une séquence prohibée pourrait être « /../ » codée en ASCII (notation hexadécimal) « 2F 2E 2E 2F » mais le principe du codage UTF-8 permet de le coder aussi avec « 2F C0 AE 2E 2F ». Si l'analyseur syntaxique n'est pas soigneusement écrit pour rejeter aussi cette chaîne, une brèche potentielle de sécurité est ouverte. Cet exemple est tiré d'un cas réel de virus attaquant des serveurs HTTP du Web en 2001.
Histoire
UTF-8 a été inventé par Ken Thompson lors d'un dîner avec Rob Pike aux alentours de septembre 1992. Il a été immédiatement utilisé dans le système d'exploitation Plan-9 sur lequel ils travaillaient. Une contrainte à résoudre était de coder les caractères nul et '/' comme en ASCII et qu'aucun octet codant un autre caractère ait le même code. Ainsi les systèmes d'exploitation UNIX pouvaient continuer à rechercher ces deux caractères dans une chaîne sans adaptation logicielle.
Prise en charge
- Navigateurs Web : la prise en charge d'UTF-8 commença à être répandue à partir de 1998
- Les anciens navigateurs Web ne supportant pas UTF-8 affichent tout de même correctement les 127 premiers caractères ASCII
- Le navigateur Netscape Navigator supporte UTF-8 à partir de sa version 4 (juin 1997)
- Le navigateur Microsoft Internet Explorer supporte UTF-8 à partir de sa version 4 (octobre 1997) pour Microsoft Windows et pour Mac OS (janvier 1998)
- Les navigateurs basés sur le moteur de rendu Gecko (lancé en 1998) supportent l'UTF-8 : Mozilla, Mozilla Firefox, etc.
- Le navigateur Opera supporte UTF-8 à partir de sa version 6 (novembre 2001).
- Le navigateur Konqueror supporte UTF-8.
Voir aussi
Liens internes
[ UTF-16 | UTF-32 | Unicode | ASCII | ISO 8859-1 | Wikipédia:Caractères spéciaux ]
Liens externes
- Histoire de la création d'UTF-8, par Rob Pike, en anglais ;
- Papier original sur UTF-8, PDF en anglais ;
- RFC 3629, UTF-8, a transformation format of ISO 10646, novembre 2003 ;
- RFC 2277, IETF policy on character sets and languages, janvier 1998.
