web-dev-qa-db-fra.com

Quelle est la différence entre Unicode et UTF-8?

Considérer:

Alt text

Est-il vrai que unicode=utf16?

Beaucoup disent qu'Unicode est un standard, pas un encodage, mais la plupart des éditeurs prennent en charge l'enregistrement au format Unicode encodage en réalité.

182
ollydbg

la plupart des éditeurs prennent en charge la sauvegarde au format ‘Unicode’.

Il s’agit d’un malheur mal nommé par Windows.

Etant donné que Windows utilise le codage UTF-16LE en interne comme format de stockage en mémoire pour les chaînes Unicode, il considère qu'il s'agit du codage naturel du texte Unicode. Dans le monde Windows, il existe des chaînes ANSI (la page de codes système de la machine en cours, sous réserve de l'instabilité totale) et des chaînes Unicode (stockées en interne sous le format UTF-16LE).

Tout cela avait été conçu aux débuts de l'Unicode, avant que nous réalisions que UCS-2 ne suffisait pas et avant qu'UTF-8 ne soit inventé. C'est pourquoi le support de Windows pour UTF-8 est médiocre.

Ce schéma de nommage mal orienté est devenu une partie de l'interface utilisateur. Un éditeur de texte utilisant la prise en charge du codage de Windows pour fournir une gamme de codages décrira automatiquement et de manière inappropriée UTF-16LE en tant que "Unicode" et UTF-16BE, le cas échéant, en tant que "Unicode big-endian".

(Ce problème n'est pas rencontré par d'autres éditeurs, tels que Notepad ++, qui effectuent eux-mêmes des encodages.)

Si vous vous sentez mieux, les chaînes "ANSI" ne sont basées sur aucune norme ANSI.

161
bobince

Comme Rasmus le dit dans son article "La différence entre UTF-8 et Unicode?" (lien corrigé):

Si vous posiez la question "Quelle est la différence entre UTF-8 et Unicode?", Répondriez-vous en toute confiance avec une réponse courte et précise? En ces temps d'internationalisation, tous les développeurs devraient pouvoir le faire. Je soupçonne que beaucoup d’entre nous ne comprennent pas ces concepts aussi bien que nous le devrions. Si vous sentez que vous appartenez à ce groupe, vous devriez lire cette introduction très courte aux jeux de caractères et aux encodages.

En fait, comparer UTF-8 et Unicode, c'est comme comparer des pommes et des oranges:

UTF-8 est un encodage - Unicode est un jeu de caractères

Un jeu de caractères est une liste de caractères avec des numéros uniques (ces numéros sont parfois appelés "points de code"). Par exemple, dans le jeu de caractères Unicode, le nombre pour A est 41.

Un codage, en revanche, est un algorithme qui traduit une liste de nombres en fichiers binaires afin qu’elle puisse être stockée sur disque. Par exemple, UTF-8 traduirait la séquence de nombres 1, 2, 3, 4 comme ceci:

00000001 00000010 00000011 00000100 

Nos données sont maintenant traduites en binaire et peuvent maintenant être sauvegardées sur le disque.

Tous ensemble maintenant

Supposons qu'une application lise les informations suivantes à partir du disque:

1101000 1100101 1101100 1101100 1101111 

L'application sait que ces données représentent une chaîne Unicode codée avec UTF-8 et doivent l'indiquer sous forme de texte à l'utilisateur. La première étape consiste à convertir les données binaires en nombres. L'application utilise l'algorithme UTF-8 pour décoder les données. Dans ce cas, le décodeur renvoie ceci:

104 101 108 108 111 

Puisque l'application sait qu'il s'agit d'une chaîne Unicode, elle peut supposer que chaque nombre représente un caractère. Nous utilisons le jeu de caractères Unicode pour traduire chaque nombre en un caractère correspondant. La chaîne résultante est "hello".

Conclusion

Ainsi, lorsque quelqu'un vous demande "Quelle est la différence entre UTF-8 et Unicode?", Vous pouvez désormais répondre en toute confiance à une réponse courte et précise:

UTF-8 (format de transformation Unicode) et Unicode ne peuvent pas être comparés. UTF-8 est un encodage utilisé pour traduire les nombres en données binaires. Unicode est un jeu de caractères utilisé pour traduire les caractères en nombres.

545
vikas devde

Ce n'est pas aussi simple.

UTF-16 est un codage 16 bits à largeur variable. Appeler quelque chose d '"Unicode" est ambigu, car "Unicode" fait référence à un ensemble complet de normes pour le codage de caractères. Unicode est pas un encodage!

http://en.wikipedia.org/wiki/Unicode#Unicode_Transformation_Format_and_Universal_Character_Set

et bien sûr, le lien obligatoire Joel On Software - Le minimum absolu que chaque développeur de logiciel a absolument, doit savoir de manière positive à propos de Unicode et des jeux de caractères (sans excuses!) .

29
Matt Ball

Il y a beaucoup de malentendus affichés ici. Unicode n'est pas an encodé, mais le standard Unicode est principalement consacré à l'encodage.

ISO 10646 est le caractère international qui vous intéresse (probablement). Il définit un mappage entre un ensemble de caractères nommés (par exemple, "lettre majuscule latine" ou "lettre alphabétique grecque") et un ensemble de points de code (un numéro attribué à chacun - par exemple, 61 hexadécimal et 3B1 hexadécimal pour ces deux respectivement; pour les points de code Unicode, la notation standard serait U + 0061 et U + 03B1).

Un jour, Unicode a défini son propre jeu de caractères, plus ou moins comme un concurrent de la norme ISO 10646. Il s’agissait d’un jeu de caractères 16 bits, mais c’était not UTF-16; il s'appelait UCS-2. Cela incluait une technique plutôt controversée consistant à essayer de réduire au minimum le nombre de caractères nécessaires (Unification Han - traitant essentiellement des caractères chinois, japonais et coréens qui se ressemblent un peu comme s'ils étaient le même caractère).

Depuis lors, le consortium Unicode a tacitement reconnu que cela ne marcherait pas et se concentre maintenant principalement sur les moyens de coder le jeu de caractères ISO 10646. Les principales méthodes sont UTF-8, UTF-16 et UCS-4 (aussi appelé UTF-32). Celles (à l'exception de UTF-8) ont également des variantes LE (little endian) et BE (big-endian).

En soi, "Unicode" pourrait faire référence à presque n'importe lequel des éléments ci-dessus (bien que nous puissions probablement éliminer les autres qu'il montre explicitement, tels que UTF-8). L'utilisation non qualifiée de "Unicode" se produit probablement le plus souvent sous Windows, où il fera presque certainement référence à UTF-16. Les premières versions de Windows NT adoptaient Unicode lorsque UCS-2 était à jour. Après que UCS-2 ait été déclaré obsolète (autour de Win2k, si la mémoire le permet), ils sont passés à UTF-16, qui est le plus similaire à UCS-2 (en fait, il est identique pour les caractères du "plan multilingue de base", qui couvre beaucoup, y compris tous les caractères de la plupart des langues d’Europe occidentale).

16
Jerry Coffin

UTF-16 et UTF-8 sont tous deux des codages Unicode. Ils sont les deux Unicode; l'un n'est pas plus Unicode que l'autre.

Ne laissez pas un artefact historique malheureux de Microsoft vous confondre.

7
Mark Ransom

Le développement de l’Unicode visait à créer un nouveau standard pour mapper les caractères dans la grande majorité des langues actuellement utilisées, ainsi que d’autres caractères qui ne sont pas aussi essentiels mais qui pourraient être nécessaires à la création du texte. UTF-8 n'est qu'un des nombreux moyens de coder les fichiers, car il existe plusieurs façons de coder les caractères d'un fichier dans Unicode.

La source:

http://www.differencebetween.net/technology/difference-between-unicode-and-utf-8/

4
Trufa

En plus du commentaire de Trufa, Unicode n'est explicitement pas UTF-16. Lorsqu’ils ont étudié pour la première fois l’Unicode, il a été supposé qu’un entier de 16 bits pourrait suffire à stocker du code, mais en pratique cela n’a pas été le cas. Cependant, UTF-16 est un autre codage valide d'Unicode - aux côtés des variantes 8 bits et 32 ​​bits - et je crois qu'il s'agit du codage que Microsoft utilise en mémoire au moment de l'exécution sur les systèmes d'exploitation dérivés de NT.

3
Tommy

Commençons par garder à l'esprit que les données sont stockées sous forme d'octets; Unicode est un jeu de caractères dans lequel les caractères sont mappés sur des points de code (entiers uniques) et nous avons besoin de quelque chose pour traduire ces données de points de code en octets. C'est là qu'UTF-8 entre dans ce qu'on appelle l'encodage - simple!

2
mrehan

C'est étrange. Unicode est un standard, pas un encodage. Comme il est possible de spécifier l’endianité, je suppose que c’est effectivement UTF-16 ou peut-être 32.

D'où vient ce menu?

1
MatTheCat