Est-ce que UTF-8, UTF-16 et UTF-32 diffèrent par le nombre de caractères qu'ils peuvent stocker?

StackOverflow https://stackoverflow.com/questions/130438

  •  02-07-2019
  •  | 
  •  

Question

d'accord. Je sais que cela ressemble au type "Pourquoi ne l'a-t-il pas fait simplement sur Google ou sur www.unicode. org et recherchez-la? & , mais pour une question aussi simple, la réponse m’échappe toujours après avoir vérifié les deux sources.

Je suis à peu près sûr que ces trois systèmes de codage prennent en charge tous les caractères Unicode, mais je dois le confirmer avant de faire cette déclaration dans une présentation.

Question bonus: ces encodages diffèrent-ils par le nombre de caractères qu’ils peuvent être étendus pour être pris en charge?

Était-ce utile?

La solution

Non, ce sont simplement des méthodes de codage différentes. Ils prennent tous en charge l’encodage du même ensemble de caractères.

UTF-8 utilise entre un et quatre octets par caractère, en fonction du caractère que vous codez. Les caractères de la plage ASCII ne prennent qu'un octet, tandis que les caractères très inhabituels en prennent quatre.

UTF-32 utilise quatre octets par caractère, quel que soit le caractère utilisé. Il utilisera donc toujours plus d’espace que UTF-8 pour coder la même chaîne. Le seul avantage est que vous pouvez calculer le nombre de caractères d’une chaîne UTF-32 en ne comptant que les octets.

UTF-16 utilise deux octets pour la plupart des caractères, quatre octets pour les caractères inhabituels.

http://fr.wikipedia.org/wiki/Comparison_of_Unicode_encodings

Autres conseils

Aucun caractère Unicode ne peut être stocké dans un codage mais pas dans un autre. Ceci est simplement dû au fait que les caractères Unicode valides ont été limités à ce qui peut être stocké dans UTF-16 (qui a la plus petite capacité des trois codages). En d’autres termes, UTF-8 et et UTF-32 pourraient être utilisés pour représenter un plus grand nombre de caractères que UTF-16, mais ils ne sont pas . Lisez la suite pour plus de détails.

UTF-8

UTF-8 est un code de longueur variable. Certains caractères nécessitent 1 octet, d'autres 2, 3 et 4. Les octets de chaque caractère sont simplement écrits les uns après les autres sous forme de flux continu d'octets.

Alors que certains caractères UTF-8 peuvent avoir une longueur de 4 octets, UTF-8 ne peut pas coder 2 ^ 32 caractères . Ce n'est même pas proche. Je vais essayer d’expliquer les raisons.

Le logiciel qui lit un flux UTF-8 obtient simplement une séquence d'octets - comment est-il supposé décider si les 4 octets suivants sont un seul caractère de 4 octets, ou deux caractères de 2 octets, ou quatre de 1 octet personnages (ou une autre combinaison)? Pour ce faire, vous devez essentiellement décider que certaines séquences de 1 octet ne sont pas des caractères valides, et que certaines séquences de 2 octets ne sont pas des caractères valides, etc. Lorsque ces séquences non valides apparaissent, on suppose qu'elles font partie d'une séquence plus longue .

Vous en avez vu un exemple assez différent, j'en suis sûr: cela s'appelle s'échapper. Dans de nombreux langages de programmation, il est décidé que le caractère \ du code source d'une chaîne ne se traduit pas par un caractère valide dans la chaîne "compilé". forme. Lorsqu'un \ est trouvé dans la source, il est supposé faire partie d'une séquence plus longue, comme \ n ou \ xFF . Notez que \ x est une séquence de 2 caractères non valide et que \ xF est une séquence de 3 caractères non valide, mais que \ xFF est un code valide. Séquence de 4 caractères.

En gros, il y a un compromis entre avoir beaucoup de caractères et avoir des caractères plus courts. Si vous voulez 2 ^ 32 caractères, ils doivent comporter en moyenne 4 octets de long. Si vous voulez que tous vos caractères aient 2 octets ou moins, vous ne pouvez pas avoir plus de 2 ^ 16 caractères. UTF-8 offre un compromis raisonnable: tous les caractères ASCII (ASCII de 0 à 127) sont donnés 1- représentations d'octets, ce qui est excellent pour la compatibilité, mais beaucoup plus de caractères sont autorisés.

Comme la plupart des codages de longueur variable, y compris les types de séquences d'échappement illustrés ci-dessus, UTF-8 est un instantané. code . Cela signifie que, le décodeur lit seulement octet par octet et dès qu’il atteint le dernier octet d’un caractère, il sait ce qu’il est (et il sait que ce n'est pas le début d'une caractère plus long).

Par exemple, le caractère "A" est représenté à l'aide de l'octet 65 et il n'y a pas de caractères à deux, trois ou quatre octets dont le premier octet est 65. Sinon, le décodeur ne pourrait pas distinguer ces caractères un 'A' suivi de quelque chose d'autre.

Mais UTF-8 est encore plus restreint. Cela garantit que l'encodage d'un caractère plus court n'apparaît jamais n'importe où dans l'encodage d'un caractère plus long. Par exemple, aucun des octets d'un caractère de 4 octets ne peut être 65.

Etant donné que UTF-8 contient 128 caractères différents sur 1 octet (dont les valeurs d'octet sont comprises entre 0 et 127), tous les caractères de 2, 3 et 4 octets doivent être composés uniquement d'octets compris entre 128 et 256. C'est une grosse restriction. Cependant, il permet aux fonctions de chaîne orientées octets de fonctionner avec peu ou pas de modification. Par exemple, la fonction strstr () de C fonctionne toujours comme prévu si ses entrées sont des chaînes UTF-8 valides.

UTF-16

UTF-16 est également un code de longueur variable; ses caractères consomment 2 ou 4 octets. Les valeurs de 2 octets dans la plage 0xD800-0xDFFF sont réservées à la construction de caractères de 4 octets. Tous les caractères de 4 octets se composent de deux octets dans la plage 0xD800-0xDBFF suivis de 2 octets dans la plage 0xDC00-0xDFFF. Pour cette raison, Unicode n'attribue aucun caractère dans la plage U + D800-U + DFFF.

UTF-32

UTF-32 est un code de longueur fixe, chaque caractère ayant une longueur de 4 octets. Bien que cela permette l’encodage de 2 ^ 32 caractères différents, seules les valeurs comprises entre 0 et 0x10FFFF sont autorisées dans ce schéma.

Comparaison de capacité:

  • UTF-8: 2 097 152 (actuellement 2 166 912 mais, en raison des détails de conception, certains d'entre eux correspondent à la même chose)
  • UTF-16: 1 112 064
  • UTF-32: 4 294 967 296 (mais limité au premier 1 114 112)

Le plus restreint est donc l'UTF-16! La définition Unicode formelle a limité les caractères Unicode à ceux qui peuvent être codés avec UTF-16 (c'est-à-dire la plage U + 0000 à U + 10FFFF, à l'exclusion des U + D800 à U + DFFF). UTF-8 et UTF-32 prennent en charge tous ces caractères.

Le système UTF-8 est en fait "artificiellement". limité à 4 octets. Il peut être étendu à 8 octets sans violer les restrictions que j'ai décrites précédemment, ce qui donnerait une capacité de 2 ^ 42. La spécification UTF-8 originale autorisait en fait jusqu'à 6 octets, ce qui donne une capacité de 2 ^ 31. Cependant, la RFC 3629 l'a limitée à 4 octets, car c'est le montant nécessaire pour couvrir tout ce que UTF-16 fait.

Il existe d'autres schémas de codage Unicode (principalement historiques), notamment UCS-2 (qui n'est capable que de coder U + 0000 en U + FFFF).

UTF-8, UTF-16 et UTF-32 prennent en charge l’ensemble des points de code Unicode. Aucun personnage n'est pris en charge par l'un mais pas un autre.

En ce qui concerne la question relative au bonus "Ces encodages diffèrent-ils par le nombre de caractères qu’ils peuvent être étendus?" Oui et non. La manière dont UTF-8 et UTF-16 sont codés limite le nombre total de points de code qu’ils peuvent prendre en charge à moins de 2 ^ 32. Toutefois, le consortium Unicode n’ajoutera pas de points de code à UTF-32 qui ne peuvent pas être représentés dans UTF-8 ou UTF-16. Cela enfreindrait l'esprit des normes de codage et rendrait impossible la garantie d'une correspondance individuelle entre UTF-32 et UTF-8 (ou UTF-16).

Je vérifie toujours personnellement le l'article de Joel sur l'unicode, les encodages et les jeux de caractères doute.

Tous les encodages UTF-8/16/32 peuvent mapper tous les caractères Unicode. Consultez la la comparaison de Wikipedia sur les codages Unicode .

Cet article d'IBM Encodez vos documents XML au format UTF-8 est très utile et indique que si vous avez le choix, il est préférable de choisir UTF-8. Les raisons principales sont principalement la prise en charge des outils, et UTF-8 peut généralement transiter par des systèmes qui ne sont pas conscients de l’unicode.

De la section Ce que disent les spécifications dans Article IBM :

  

Le W3C et l'IETF ont tous deux   récemment devenu plus catégorique à propos de   choisir UTF-8 en premier, dernier et   parfois seulement. Le personnage du W3C   Modèle pour le World Wide Web 1.0:   États fondamentaux, "quand un unique   le codage de caractères est requis, le   le codage de caractères DOIT être UTF-8,   UTF-16 ou UTF-32. US-ASCII est   compatibilité ascendante avec UTF-8 (un   La chaîne US-ASCII est aussi un UTF-8   chaîne, voir [RFC 3629]), et UTF-8 est   donc approprié si compatibilité   avec US-ASCII est souhaité. " Dans   pratique, compatibilité avec US-ASCII   est si utile que c'est presque un   exigence. Le W3C explique sagement,   "Dans d'autres situations, comme pour   Les API, UTF-16 ou UTF-32 peuvent être plus   approprié. Raisons possibles pour   en choisissant l'un d'entre eux   efficacité du traitement interne et   interopérabilité avec d'autres   processus. "

Comme tout le monde l’a dit, les formats UTF-8, UTF-16 et UTF-32 peuvent tous coder tous les points de code Unicode. Cependant, la variante UCS-2 (parfois appelée à tort UCS-16) ne peut pas , et c’est celle que vous trouvez, par exemple. sous Windows XP / Vista .

Voir Wikipedia pour plus d'informations.

Modifier: Je me trompe à propos de Windows. NT était le seul à prendre en charge UCS-2. Cependant, de nombreuses applications Windows supposent un seul mot par point de code, comme dans UCS-2. Par conséquent, il est probable que vous trouviez des bogues. Voir un autre article de Wikipedia . (Merci JasonTrue)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top