2010-09-18 17 views
1

Unicode attribue simplement un entier à chaque caractère. UTF-8 ou autres sont utilisés pour coder ces entiers ("points de code") en une séquence d'octets à stocker dans la mémoire. Ma question est la suivante: pourquoi ne pouvons-nous pas simplement stocker le caractère en tant que représentation binaire de sa valeur Unicode (le "point de code")? Par conséquent, certaines langues ont des caractères qui nécessitent plusieurs octets pour les représenter. N'est-il pas plus facile de les stocker comme le binaire de leurs points de code?Quel est le besoin de coder les caractères Unicode via UTF, etc? Pourquoi ne pouvons-nous pas simplement les stocker en tant que binaires de points de code?

+0

Je ne comprends pas ce que vous entendez par "binaire de leurs points de code"? N'est-ce pas exactement ce qui se passe déjà? –

+0

Le binaire exact des points de code nécessiterait toujours 4 octets, mais ce n'est pas ce qui se passe en UTF-8 ou UTF-16, si je ne me trompe pas. Certains caractères sont encodés en moins de 4 octets. Je voulais dire exactement leur binaire. Désolé pour la confusion. – Daud

Répondre

2

Oui, nous pouvons, et c'est UTF-32.

Le problème est que l'UTF-32 gaspille beaucoup d'espace. Si le texte contient beaucoup de texte européen/hébreu/arabe, avec UTF-8, il ne prend que 1 à 2 octets par point de code, mais avec UTF-32, il prend 4 octets par point de code.

Si nous stockons la valeur entière en tant que taille variable, par ex. 0 ~ 255 utiliser 1 octet, 256 ~ 65535 utiliser 2 octets etc., nous aurions un problème d'ambiguïté, par exemple. 5a 5a doit-il représenter "ZZ" ou "& # x5a5a;"? Fondamentalement, la solution est ce que nous appelons UTF-8 - nous utilisons des bits spéciaux pour indiquer la longueur de la séquence d'octets pour donner un résultat de décodage unique.

+0

Merci. Mais une chose que je ne peux pas comprendre est que ce qui est si spécial sur certains caractères qu'ils peuvent être montés en seulement 1 ou 2 octets, tandis que d'autres nécessitent plus d'octets? – Daud

+0

@Daud: Ces caractères sont utilisés plus fréquemment. – kennytm

+0

Merci. Mais ce que je voulais dire, c'est que si certains caractères peuvent être ajustés en 1 ou 2 octets, ce qui empêche les autres caractères d'être ajustés en 1 ou 2 octets. – Daud

0

Premièrement, il existe un moyen de les stocker en tant que points de code bruts. C'est UTF-32 ou UCS-4. Chaque caractère aura toujours quatre octets, et stockera chaque codepoint non modifié.

Cependant, les raisons d'utiliser d'autres tels que UTF-8 comprennent:

  • compatibilité ASCII: les fichiers qui ne contiennent que U + 0000 - U + 007F ne pas besoin de changer du tout
  • taille efficacité: UTF-8 se termine généralement dans des fichiers beaucoup plus petits
+0

Merci. Mais une chose que je ne peux pas comprendre est que ce qui est si spécial sur certains caractères qu'ils peuvent être montés en seulement 1 ou 2 octets, tandis que d'autres nécessitent plus d'octets? – Daud

1

Comment exactement enregistreriez-vous ces points de code? Certains points de code tiennent dans un octet, certains ont besoin de 3 octets. Utiliserez-vous 4 octets par point de code? Lorsque vous regardez un flux d'octets, comment savez-vous où s'arrête un point de code et où commence un autre? UTF-8 (et d'autres encodages) vous donne une réponse à cela.