6 votes

Pourquoi Unicode a un grand ou un petit endian mais pas UTF-8 ?

UNICODE utilise 2 octets pour un caractère, il y a donc une différence entre big et little endian. Par exemple, le caractère est 54 C8 en hexagone. Et son UTF-8 est donc :

11100101 10010011 10001000

UTF-8 utilise 3 octets pour présenter le même caractère, mais il n'a pas de grand ou petit endian. Pourquoi ?

36voto

James Mertz Points 390

Remarque : Windows utilise le terme "Unicode" pour UCS-2 pour des raisons historiques - à l'origine, il s'agissait de l'appellation "Unicode". sólo pour encoder les points de code Unicode en octets, la distinction n'avait donc pas d'importance. Mais dans la terminologie moderne, les deux Les exemples sont Unicode, mais le premier est spécifiquement UCS-2 ou UTF-16 et le second est UTF-8.

L'UCS-2 avait un big-endian et un little-endian parce qu'il représentait directement le point de code sous la forme d'un nombre 16 bits "uint16_t" ou "short int", comme en C et dans d'autres langages de programmation. Il ne s'agit pas tant d'un "codage" que d'une représentation directe en mémoire des valeurs numériques, et comme un uint16_t peut être BE ou LE sur différentes machines, il en va de même pour l'UCS-2. L'UTF-16 ultérieur a simplement hérité du même désordre pour des raisons de compatibilité.

(Il est probable que pourrait auraient été définis pour un endianness spécifique, mais je suppose qu'ils ont estimé que c'était hors de portée ou qu'ils ont dû faire un compromis entre des personnes représentant différents fabricants de matériel ou quelque chose comme ça. Je ne connais pas l'histoire réelle).

En revanche, UTF-8 est un longueur variable qui peut utiliser entre 1 et 6 octets pour représenter une valeur de 31 bits. La représentation par octet n'a aucun rapport avec l'architecture du processeur. il existe un algorithme spécifique pour encoder un nombre en octets, et vice versa. L'algorithme produit ou consomme toujours les bits dans le même ordre, quelle que soit l'unité centrale sur laquelle il est exécuté.

22voto

phuclv Points 22397

C'est exactement la même raison pour laquelle un tableau d'octets ( char[] en C ou byte[] dans de nombreux autres langages) n'a pas d'endianness associée mais les tableaux d'autres types plus grands que byte faire. C'est parce que endiveté es la façon dont on stocke en mémoire une valeur représentée par plusieurs octets . Si vous n'avez qu'un seul octet, vous n'avez qu'une seule façon de le stocker en mémoire. Mais si un int est composé de 4 octets avec les index 1 à 4, alors vous pouvez le stocker dans de nombreux ordres différents comme [1, 2, 3, 4], [4, 3, 2, 1], [2, 1, 4, 3], [3, 1, 2, 4]... ce qui est little endian, big endian, mixed endian...

Unicode a de nombreux codifications appelé Format de transformation Unicode dont les principales sont UTF-8, UTF-16 et UTF-32. L'UTF-16 et l'UTF-32 fonctionnent sur une base de unité de 16 et 32 bits respectivement, et évidemment lorsque vous stockez 2 ou 4 octets dans une mémoire adressée par octets, vous devez définir un ordre des octets à lire/écrire. UTF-8, quant à lui, fonctionne sur un unité d'octet donc il n'y a pas d'endianness dans ce document.

-1voto

David42 Points 99

La raison en est très simple. Il existe des versions big et little endian d'UTF-16 et d'UTF-32 parce qu'il y a des ordinateurs avec des registres bit et little endian. Si l'endiveté d'un fichier Unicode correspond à l'endiveté du processeur, la valeur du caractère peut être lue directement de la mémoire en une seule opération. S'ils ne correspondent pas, une deuxième étape de conversion est nécessaire pour inverser la valeur.

En revanche, le caractère endianné du processeur n'est pas pertinent lors de la lecture d'UTF-8. Le programme doit lire les octets individuels et effectuer une série de tests et de décalages de bits pour obtenir la valeur du caractère dans un registre. Il serait inutile d'avoir une version où l'ordre des octets serait inversé.

-3voto

marshal craft Points 83

Selon certains documents de Windows, l'encodage correspond à un flux de 4 octets maximum. Il est également dit que l'endianness du processeur n'a pas d'importance. Donc, ce que je pense que cela signifie pour le développeur, c'est que vous n'êtes pas censé vous soucier de l'endienneté avec utf-8 sous Windows. C'est la philosophie de conception. Vous devez donc vous concentrer sur l'utilisation appropriée de la fonctionnalité de Windows pour que cela n'ait pas d'importance. Les flux entrants peuvent avoir de l'importance, mais le décodage et l'encodage de l'utf-8 ne devraient pas poser de problème.

Il est toutefois possible d'aller au-delà, de comprendre pleinement, ce qui peut aider. Mais en gros, Windows dit que vous n'avez pas besoin de connaître l'endienneté du système pour traiter l'utf-8 pour l'encodage et le décodage des flux en utf-8.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X