Si UTF-8 est de 8 bits, cela ne signifie-t-il pas qu'il ne peut y avoir que 256 caractères différents au maximum?
Les 128 premiers points de code sont les mêmes qu'en ASCII. Mais il dit que UTF-8 peut prendre en charge jusqu'à un million de caractères?
Comment cela marche-t-il?
Réponses:
UTF-8 n'utilise pas un octet tout le temps, c'est 1 à 4 octets.
source: Wikipédia
la source
UTF-8 utilise 1 à 4 octets par caractère: un octet pour les caractères ascii (les 128 premières valeurs Unicode sont les mêmes que ascii). Mais cela ne nécessite que 7 bits. Si le bit le plus élevé ("signe") est mis à 1, cela indique le début d'une séquence multi-octets; le nombre de bits hauts consécutifs définis 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 avec 6 bits chacun pour la valeur, produisant une valeur de 21 bits. 2 ^ 21 dépasse le nombre de caractères Unicode, donc tout l'Unicode peut être exprimé en UTF8.
la source
Selon ce tableau * UTF-8 devrait prendre en charge:
2 31 = 2.147.483.648 caractères
Cependant, la RFC 3629 a limité les valeurs possibles, donc maintenant nous sommes plafonnés à 4 octets , ce qui nous donne
2 21 = 2097152 caractères
Notez qu'une bonne partie de ces caractères est "réservée" à un usage personnalisé, ce qui est en fait assez pratique pour les polices d'icônes.
* Wikipédia a utilisé un tableau de 6 octets - ils ont depuis mis à jour l'article.
la source
0xxxxxxx
donne 7 bits utilisables,110xxxxx 10xxxxxx
donne 11 de plus - il n'y a pas de chevauchement. Le premier octet commence par0
dans le premier cas et1
dans le second cas.00000001
stocke-t-il et que11000000 100000001
stocke-t-il?Unicode contre 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écification. Ils ont tous deux des limites différentes. UTF-8 a une limite ascendante différente.
Unicode
Unicode est désigné par «plans». Chaque plan porte 2 à 16 points de code. Il y a 17 plans en Unicode. Pour un total de
17 * 2^16
points de code. Le premier plan, le plan 0 ou le BMP , est spécial par le poids de ce qu'il transporte.Plutôt que d'expliquer toutes les nuances, laissez-moi simplement citer l'article ci-dessus sur les avions.
UTF-8
Revenons maintenant à l'article lié ci-dessus,
Vous pouvez donc voir que vous pouvez mettre des éléments dans UTF-8 qui ne sont pas Unicode valide. Pourquoi? Parce que UTF-8 accepte des points de code qu'Unicode ne prend même pas en charge.
UTF-8, même avec une limitation de quatre octets, prend en charge 2 21 points de code, ce qui est bien plus que
17 * 2^16
la source
2 164 864 «caractères» peuvent être potentiellement codés par UTF-8.
Ce nombre est 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21 qui vient du fonctionnement de l'encodage:
Les caractères 1 octet ont 7 bits pour le codage
0xxxxxxx
(0x00-0x7F)Les caractères à 2 octets ont 11 bits pour le codage
110xxxxx 10xxxxxx
(0xC0-0xDF pour le premier octet; 0x80-0xBF pour le second)Les caractères à 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 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 voir, c'est beaucoup plus grand que l'Unicode actuel (1 112 064 caractères).
METTRE À JOUR
Mon calcul initial est faux car il ne tient pas compte de règles supplémentaires. Voir les commentaires sur cette réponse pour plus de détails.
la source
UTF-8 est un codage de longueur variable avec un minimum de 8 bits par caractère.
Les caractères avec des points de code plus élevés prendront jusqu'à 32 bits.
la source
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
donc seulement 21 bits peuvent être utilisés pour coder le caractère réel.Citation de Wikipedia: "UTF-8 encode chacun des 1 112 064 points de code dans le jeu de caractères Unicode en utilisant un à quatre octets de 8 bits (appelés" octets "dans la norme Unicode)."
Quelques liens:
la source
Consultez la norme Unicode et les informations connexes, telles que leur entrée de FAQ, UTF-8 UTF-16, UTF-32 et BOM . Ce n'est pas si facile, 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» se rapporte à la longueur des unités de code en bits. Les unités de code sont des entités utilisées pour encoder des caractères, pas nécessairement comme un simple mappage un-à-un. UTF-8 utilise un nombre variable d'unités de code pour encoder 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 encodent tous tout l'espace de codage Unicode, qui comprend même des non-caractères et des points de code non attribués.
la source
Bien que je sois d'accord avec mpen sur les codes UTF-8 maximum actuels (2164864) (énumérés ci-dessous, je ne peux pas commenter 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 n'a supprimé que la limite de 4 octets).
Le code de départ 254 suit la disposition de base des bits de départ (indicateur multi-bits mis à 1, un compte de 6 1 et terminal 0, pas de bits de réserve) vous donnant 6 octets supplémentaires avec lesquels travailler (6 groupes 10xxxxxx, 2 ^ supplémentaires 36 codes).
Le code de départ 255 ne suit pas exactement la configuration de base, pas de terminal 0 mais tous les bits sont utilisés, ce qui vous donne 7 octets supplémentaires (indicateur multi-bits mis à 1, un compte de 7 1 et pas de terminal 0 car tous les bits sont utilisés ; 7 groupes 10xxxxxx, 2 ^ 42 codes supplémentaires).
L'ajout de ces derniers donne un jeu de caractères présentable maximum final de 4 468 982 745 216. C'est plus que tous les caractères utilisés actuellement, les langues anciennes ou mortes et toutes les langues supposées perdues. Script angélique ou céleste quelqu'un?
Il existe également des codes à un octet qui sont ignorés / ignorés dans la norme UTF-8 en plus de 254 et 255: 128-191, et quelques autres. Certains sont utilisés localement par le clavier, l'exemple de code 128 est généralement un retour arrière de suppression. Les autres codes de démarrage (et les plages associées) ne sont pas valides pour une ou plusieurs raisons ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
la source
Unicode est fermement marié à UTF-8. Unicode prend spécifiquement en charge 2 ^ 21 points de code (2097152 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 des 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 137439 caractères
De la norme Unicode. FAQ Unicode
À partir de la page Wikipedia UTF-8. Description de l'UTF-8
la source