UTF-8 et Unicode

UNICODE et son codage UTF-8 permettent l’utilisation de tous les caractères (accentués, pictogrammes, idéogramme ou émoticones) dans les chaînes et s’imposent de ce fait de plus en plus sur les pages Internet et dans les langages de programmation. Ces caractères n’apparaissent bien sûr que dans la mesure où ils sont pris en compte dans une police chargée sur votre système.

UTF-8 et Unicode sont souvent confondus, mais il s’agit de deux choses distinctes :

Le codage UTF-8 utilise d’un à quatre octets. Un seul pour le code ASCII de 0 à 127, deux pour les lettres latines accentuées et de nombreux alphabets non latins. Les caractères spéciaux (mathématiques, semi-graphiques...) et les systèmes idéographiques actuels sont codés sur trois octets, tandis que les écritures antiques (hiéroglyphes et cunéiformes) et les émoticones sont codés sur quatre.

Encodages

Avec la convention des lettres a à u pouvant valoir 0 ou 1, il existe quatre formes d’encodage :

0abcdefg

Tout octet dont le bit le plus fort est nul (donc inférieur à 128) code nécessairement un caractère ASCII. Les sept lettres valant 0 ou 1 : 27 =128 caractères, bien que la plupart des octets inférieurs à 32 ne sont pas utilisés dans les simples textes, qu’il s’agisse de page HTML ou des chaînes de caractères dans la plupart des langages de programmation.

Les caractères ASCII, dont le rang est inférieur à 128, sont repris tels quels dans le codage UTF-8.

110abcde 10fghijk

Si le point de code dépasse 127, le caractère doit probablement être codé sur deux octets. Le premier octet commence nécessairement par 1100 ou 1101, soit les quartets 12 ou 13 ( 0xC ou 0xD en hexadécimal)

Le second octet est de type par 1000, 1001, 1010 ou 1011 (0x8 ou 0x9, 0xA ou 0xB en hexadécimal). Cette formule peut théoriquement coder 211 =2 048 caractères sauf les 128 premiers, codés sur un seul octet, et les 32 suivants, réservés selon les standards iso8859.

Certains octets de la plage 160-255 ne peuvent convenir pour le premier ou second octet d’un caractère UTF8, ce qui explique qu’un texte sauvegardé en latin1 ou cp1252 n’est pas entièrement lu dans un environnement UTF-8, qui les affiche souvent . Cette remarque vaut pour les points suivants.

Les points de codes convertis en deux octets servent à coder les caractères latins accentués, l’alphabet de prononciation international, et de très nombreux alphabets.

1110abcd 10efghij 10klmnop

Au delà du point de code 2048, il faut trois octets, dont le premier qui commence nécessairement par 1110, soit le quartet 15 (en hexadécimal 0xE). Les deux octets qui suivent commencent également par 10. La couverture théorique de points de code est de 216 =65.536 caractères. Les 2048 premiers points de code ne sont bien entendu pas concernés par la transformation en trois octets.

Les points de code en trois octets servent à de nombreux symboles mathématiques, à la ponctuation typographique, aux caratères semi-graphiques, dingbats et idéogrammes orientaux.

11110abc 10defghi 10jklmno 10pqrstu

Les caractères dont le point de code dépasse 65 536, le codage UTF8 utilise quatre octets. Le premier commence nécessairement par un quartet égal à 15 (0xF en hexadécimal), le deuxième quartet étant inférieur à 8. Les autres octets suivants commencent tous par 10. Le nombre théorique de caractères codés sur quatre octets est de 221 =2.097.152 caractères.

Les caractères codés en quatre octets concernent en général des écritures anciennes (le cunéiforme) ou les émoticones en couleurs. Certains serveurs SQL n’en tiennent pas compte.

Et ensuite ?

Il ne serait pas impossible de coder sur cinq octets (26 bits codables), voire six (31), mais la norme s’arrête à quatre octets maximum.

Discussion

Le format UTF-8 est pratique pour les programmeurs : si un caractère est codé avec une suite de quatre octets WXYZ, aucun autre caractère n’est codé par les paires WX, XY ou YZ ou les triplets WXY ou XYZ, ce qui signifie qu’une séquence de deux (ou trois) octets codant un caractère unicode ne peut être contenu dans une séquence codant un autre caractère. Cela permet des remplacements de séquences d’octets représentant des caractères unicode en étant sûr de ne pas en altérer d’autres. Mais actuellement, les langages de programmation manipulent eux-mêmes les chaînes UTF-8.

La lettre U (position unicode 85) est codée 01010101. Elle pourrait également être codée sur deux octets 11000001 10010101. Ce n'est pas permis, toutes les possibilités théoriques vues ci-dessus ne sont donc pas légales.

Le codage utilise en général plus d’octets qu'il n'y a de signes typographiques. Le codage UTF-8 d’un fichier-texte en français compte environ 6% d’octets de plus que de caractères, les lettres accentuées prenant deux octets, certains signes typographiques (tiret (semi-)cadratins, puces...) en valant trois.

En cyrillique, arabe, grec monotonique, hébreu et turc, le codage en UTF-8 prendra systématiquement deux octets (trois pour le thaï), alors que les codages iso8859-5, -6, -7, -8, -9 et -11 ne prennent qu’un octet.

De la même manière, les encodages spécifiques au idéogrammes (ISO2022, GBK, Big5, JIS) prennent deux octets, pour trois en UTF-8.

Sur ce site, il est question d’UTF-8 sur les pages python et HTML. Pour les codages sur un seul octet, voir ISO8859.

Doublets Unicode

Certains caractères identiques ou très proches disposent de deux codages différents. Par exemple :