La norme Unicode comporte suffisamment de points de code pour qu'il faille 4 octets pour les stocker tous. C'est ce que fait l'encodage UTF-32. Pourtant, le codage UTF-8 les comprime en quelque sorte dans des espaces beaucoup plus petits en utilisant quelque chose appelé "codage à largeur variable".
En fait, il parvient à représenter les 127 premiers caractères de l'US-ASCII en un seul octet qui ressemble exactement au véritable ASCII, de sorte que vous pouvez interpréter beaucoup de texte ascii comme s'il s'agissait d'UTF-8 sans rien y faire. Un bon truc. Comment cela fonctionne-t-il ?
Je vais poser ma propre question et y répondre, car j'ai lu un peu pour trouver la réponse et j'ai pensé que cela pourrait faire gagner du temps à quelqu'un d'autre. De plus, quelqu'un pourra peut-être me corriger si j'ai fait des erreurs.
8 votes
L'Unicode droit fait no nécessite 32 bits pour coder tous ses points de code. Ils ont un jour revendiqué ce nombre de points de code possibles, mais après le décollage de l'UTF-8, ils se sont intentionnellement limités à 21 bits, afin que l'UTF-8 ne dépasse jamais 4 octets par caractère. Unicode ne requiert actuellement que 17 bits pour contenir tous les points de code possibles. Sans cette limitation, UTF-8 aurait pu aller jusqu'à 6 octets par caractère.
0 votes
@Warren : plutôt exact, mais Unicode est un code de 21 bits (U+0000 à U+10FFFF).
2 votes
@Warren : L'UTF-8 limité à 4 octets aurait pu supporter jusqu'à U+1FFFFF. La restriction à U+10FFFF a été faite pour le bien de l'UTF-16.
0 votes
@dan04 Avons-nous une explication facile de la restriction à U+10FFFF par UTF-16 ? Il serait bon d'en savoir plus à ce sujet.
0 votes
@A-letubby : Parce que les codes UTF-16 "substituts" sont alloués de telle sorte qu'il y a 1024 substituts de tête et 1024 substituts de queue (et ils ne peuvent être utilisés que par paires), pour faire 2^20 (environ un million) caractères supplémentaires disponibles au-delà du BMP. Ajoutés aux 2^16 caractères disponibles dans le BMP, cela fait 0x110000 caractères possibles.
0 votes
@A-letubby : le schéma d'encodage utilisé par l'UTF-16 ne peut pas physiquement encoder les points de code supérieurs à U+10FFFF, mais l'UTF-8 le peut (les premières spécifications de l'UTF-8 autorisaient des séquences de 5 et 6 octets pour gérer les points de code jusqu'à U+7FFFFFFF). Le point de code légal le plus élevé dans l'UTF-8 était limité à U+10FFFF par la norme RFC 3629 pour maintenir la compatibilité avec l'UTF-16, par Section 12 Changements par rapport au RFC 2279 : " Limitation de la gamme de caractères à 0000-10FFFF (la gamme accessible par UTF-16). "