Fork me on GitHub

UTF-8

UTF-8 est un standard de codage de Unicode, successeur de UTF-16. À la différence de UTF-16 il encode les symboles Unicode sur 1, 2, 3 ou 4 octets, et il est compatible en arrière avec ASCII-7. Le fait que les caractères du jeu ASCII-7 soient encodés sur un seul octet, donne à UTF-8 un pouvoir de compression bien supérieur à UTF-16.

Encodage

L’encodage de UTF-8 est résumé par le tableau suivant.

Code point bits Octet 1 Octet 2 Octet 3 Octet 4 Octet 5 Octet 6
U+0000U+007F 7 0xxxxxxx          
U+0080U+07FF 11 110xxxxx 10xxxxxx        
U+0800U+FFFF 16 1110xxxx 10xxxxxx 10xxxxxx      
U+10000U+1FFFFF 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx    
U+200000U+3FFFFFF 26 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
U+4000000U+7FFFFFFF 31 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

En vrai, le plus grand code point UTF-8 est U+10FFFF, par conséquent les deux dernières lignes du tableau ne sont jamais utilisées par UTF-8, et tous les symboles encodés par UTF-8 tiennent sur au plus 4 octets.

Algorithme

Le tableau s’utilise de la façon suivante:

On remarque que:

  1. Les code points dans la plage U+0000U+00FF sont encodés par les propre code point sur un octet. Ce sont les caractères du jeu ASCII 7, ce qui garantit la compatibilité en arrière de UTF-8 : tout fichier ASCII-7 valide est aussi un fichier UTF-8 valide contenant les mêmes symboles, et inversement tout fichier UTF-8 ne contenant que des symboles dans cette plage est un fichier ASCII valide.

  2. Les octets qui commencent par 1 font partie d’un symbole encodé sur plusieurs octets.

  3. Les octets qui commencent par 10 sont les octets du milieu d’un symbole encodé sur plusieurs octets

  4. Le nombre de 1 précédent le 0 d’un octet ne commençant ni par 0 ni par 10 est égal au nombre d’octets sur lesquels est encodé le symbole UTF-8 contenant l’octet.

Les trois dernières propriétés font de UTF-8 un code instantané: tout octet provenant du milieu d’un flux UTF-8 peut immédiatement être reconnu comme étant le début ou non d’un symbole Unicode.