web-dev-qa-db-fra.com

Combien de caractères UTF-8 peut-il encoder?

Si UTF-8 est de 8 bits, cela ne signifie-t-il pas qu'il ne peut y avoir qu'un maximum de 256 caractères différents?

Les 128 premiers points de code sont les mêmes qu'en ASCII. Mais il est dit que UTF-8 peut supporter jusqu'à un million de caractères?

Comment cela marche-t-il?

78
eMRe

UTF-8 n'utilise pas un octet tout le temps, c'est de 1 à 4 octets.

Les 128 premiers caractères (US-ASCII) nécessitent un octet.

Les 1 920 caractères suivants nécessitent deux octets à encoder. Cela couvre le reste de presque tous les alphabets latins, ainsi que les alphabets grec, cyrillique, copte, arménien, hébreu, arabe, syriaque et Tana, ainsi que la combinaison de marques diacritiques.

Trois octets sont nécessaires pour les caractères du reste du plan multilingue de base, qui contient pratiquement tous les caractères couramment utilisés [12], y compris la plupart des caractères chinois, japonais et coréen [CJK].

Quatre octets sont nécessaires pour les caractères des autres plans d'Unicode, qui comprennent des caractères CJK moins courants, divers scripts historiques, des symboles mathématiques et des emoji (symboles pictographiques).

source: Wikipedia

112
zwippie

UTF-8 utilise 1 à 4 octets par caractère: un octet pour les caractères ascii (les 128 premières valeurs unicode sont identiques à ascii). Mais cela ne nécessite que 7 bits. Si le bit le plus élevé ("signe") est défini, cela indique le début d'une séquence multi-octets; le nombre de bits hauts consécutifs défini indique le nombre d'octets, puis un 0 et les bits restants contribuent à la valeur. Pour les autres octets, les deux bits les plus élevés seront 1 et 0 et les 6 bits restants sont pour la valeur.

Ainsi, une séquence de quatre octets commencerait par 11110 ... (et ... = trois bits pour la valeur), puis trois octets de 6 bits chacun pour la valeur, générant une valeur de 21 bits. 2 ^ 21 dépasse le nombre de caractères Unicode, de sorte que tous les caractères Unicode peuvent être exprimés en UTF8.

35

Selon cette table * UTF-8 devrait soutenir:

231 = 2 147 483 648 caractères

Cependant, la RFC 3629 limitait les valeurs possibles, nous sommes donc maintenant plafonnés à 4 octets , ce qui nous donne

221 = 2 097 152 caractères

Notez qu'un bon nombre de ces caractères sont "réservés" pour une utilisation personnalisée, ce qui est en fait assez pratique pour les polices-icônes.

* Wikipedia utilisé montre une table de 6 octets - ils ont depuis mis à jour l'article.

2017-07-11: Corrigé lors du double comptage du même point de code codé avec plusieurs octets

23
mpen

Unicode vs UTF-8

Unicode résout les points de code en caractères. UTF-8 est un mécanisme de stockage pour Unicode. Unicode a une spécification. UTF-8 a une spéc. Ils ont tous deux des limites différentes. UTF-8 a une borne ascendante différente.

Unicode

Unicode est désigné par "plans." Chaque plan porte 216 points de code. Il y a 17 avions en Unicode. Pour un total de 17 * 2^16 points de code. Le premier plan, le plan 0 ou le BMP , est spécial dans le poids de ce qu'il transporte.

Plutôt que d’expliquer toutes les nuances, permettez-moi de citer l’article susmentionné sur les avions.

Les 17 avions peuvent accueillir 1 114 112 points de code. Sur ce nombre, 2 048 sont des substituts, 66 autres que des personnages et 137 468 sont réservés à un usage privé, ce qui laisse 974 530 pour une affectation publique.

UTF-8

Revenons maintenant à l'article lié ci-dessus,

Le schéma de codage utilisé par UTF-8 a été conçu avec une limite beaucoup plus grande de 231 points de code (32 768 avions), et peut encoder 221 des points de code (32 plans) même s'ils sont limités à 4 octets. [3] Comme Unicode limite les points de code aux 17 plans pouvant être codés par UTF-16, les points de code supérieurs à 0x10FFFF ne sont pas valides dans les formats UTF-8 et UTF-32.

Vous pouvez donc voir que vous pouvez insérer dans UTF-8 des éléments qui ne sont pas valides en Unicode. Pourquoi? Parce que UTF-8 gère des points de code non supportés par Unicode.

UTF-8, même avec une limite de quatre octets, supporte 221 points de code, qui est beaucoup plus que 17 * 2^16

15
Evan Carroll

2 164 864 "caractères" peuvent être potentiellement codés par UTF-8.

Ce nombre est 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21, ce qui découle du fonctionnement de l'encodage:

  • Les caractères de 1 octet ont 7 bits pour le codage 0xxxxxxx (0x00-0x7F)

  • Les caractères de 2 octets ont 11 bits pour le codage 110xxxxx 10xxxxxx _ (0xC0-0xDF pour le premier octet; 0x80-0xBF pour le second)

  • Les caractères de 3 octets ont 16 bits pour le codage 1110xxxx 10xxxxxx 10xxxxxx (0xE0-0xEF pour le premier octet; 0x80-0xBF pour les octets de continuation)

  • Les caractères de 4 octets ont 21 bits pour le codage 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (0xF0-0xF7 pour le premier octet; 0x80-0xBF pour les octets de continuation)

Comme vous pouvez le constater, cette taille est nettement supérieure à l’Unicode actuel (1 112 064 caractères).

13
Ruben Reyes

UTF-8 est un codage de longueur variable avec n minimum de 8 bits par caractère.
Les caractères avec des points de code plus élevés prendront jusqu'à 32 bits.

5
deceze

Citation de Wikipedia: "UTF-8 code chacun des 1 112 064 points de code du jeu de caractères Unicode en utilisant un à quatre octets de 8 bits (appelés" octets "dans la norme Unicode)."

Quelques liens:

3
ZZ-bb

Consultez la norme Unicode et des informations connexes, telles que leur entrée FAQ, TF-8, UTF-16, UTF-32 et BOM) . Ce n'est pas si simple, mais ce sont des informations faisant autorité, et une grande partie de ce que vous pourriez lire sur UTF-8 ailleurs est discutable.

Le "8" dans "UTF-8" correspond à la longueur en unités de code . Les unités de code sont des entités utilisées pour coder des caractères, pas nécessairement comme un simple mappage un à un. UTF-8 utilise un nombre variable d'unités de code pour coder un caractère.

La collection de caractères pouvant être encodés en UTF-8 est exactement la même que pour UTF-16 ou UTF-32, à savoir tous les caractères Unicode. Ils codent tous la totalité de l’espace de codage Unicode, qui inclut même des caractères non-caractères et des points de code non attribués.

2
Jukka K. Korpela

Bien que je sois d’accord avec mpen sur les codes UTF-8 maximum actuels (2 164 864) (énumérés ci-dessous, je ne peux pas en dire plus sur le sien), il est décalé de 2 niveaux si vous supprimez les 2 restrictions majeures de UTF-8: seulement 4 octets. limite et les codes 254 et 255 ne peuvent pas être utilisés (il a seulement supprimé la limite de 4 octets).

Le code de départ 254 suit la disposition de base des bits de départ (drapeau multi-bits réglé sur 1, nombre de 6 1 et terminal 0, pas de bits disponibles), ce qui vous donne 6 octets supplémentaires (6 groupes de 10xxxxxx, 2 36 codes).

Le code de départ 255 ne suit pas exactement la configuration de base, aucun terminal 0 mais tous les bits sont utilisés, ce qui vous donne 7 octets supplémentaires (indicateur multi-bits défini sur 1, un nombre de 7 1 et aucun terminal 0 car tous les bits sont utilisés ; 7 groupes 10xxxxxx, 2 ^ 42 codes supplémentaires).

L'ajout de ceux-ci dans donne un jeu final de 4 468 982 745 216 personnes au maximum pouvant être présenté. C’est plus que tous les caractères actuellement utilisés, les langues anciennes ou mortes et toutes les langues supposées perdues. Quel est le script angélique ou céleste?

Il existe également des codes à un octet qui sont négligés/ignorés dans la norme UTF-8, en plus des codes 254 et 255: 128-191 et quelques autres. Certains sont utilisés localement par le clavier, le code exemple 128 est généralement un effacement arrière. Les autres codes de départ (et les plages associées) ne sont pas valides pour une ou plusieurs raisons ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).

1
James V. Fields

Unicode est fermement marié à UTF-8. Unicode prend spécifiquement en charge 2 ^ 21 points de code (2 097 152 caractères), ce qui correspond exactement au même nombre de points de code pris en charge par UTF-8. Les deux systèmes réservent le même espace "mort" et les mêmes zones restreintes pour les points de code, etc. depuis juin 2018, la version la plus récente, Unicode 11.0, contient un répertoire de 137 439 caractères

Du standard Unicode. FAQ Unicode

La norme Unicode code les caractères dans la plage U + 0000..U + 10FFFF, ce qui correspond à un espace de code de 21 bits.

Extrait de la page Wikipedia UTF-8. Description de UTF-8

Depuis la limitation de l'espace de code Unicode à des valeurs de 21 bits en 2003, UTF-8 est défini pour coder des points de code de un à quatre octets, ...

1
Display name