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

j'ai entendu des opinions contradictoires des gens - selon Wikipedia, voir ici .

C'est la même chose, n'est-ce pas? Quelqu'un peut clarifier?

386
demandé sur Raedwald 0000-00-00 00:00:00

10 réponses

pour développer les réponses que d'autres ont données:

nous avons beaucoup de langues avec beaucoup de caractères que les ordinateurs devraient idéalement afficher. Unicode attribue à chaque caractère un numéro unique ou un point de code.

les ordinateurs traitent avec des nombres tels que des octets... sautant un peu d'histoire ici et ignorant les problèmes de mémoire, les ordinateurs 8-bit traiteraient un octet 8-bit comme la plus grande unité numérique facilement représentée sur le matériel, 16-bit les ordinateurs développer qu'à deux octets, et ainsi de suite.

les anciens codages de caractères tels que ASCII datent de l'ère (pré-) 8 bits, et tentent de convertir la langue dominante dans le calcul à l'époque, c'est-à-dire l'anglais, en nombres allant de 0 à 127 (7 bits). Avec 26 lettres dans l'alphabet, à la fois en forme de capitale et non-capitale, des chiffres et des signes de ponctuation, qui a fonctionné assez bien. ASCII a été prolongée d'un 8ème bit pour les autres langues, mais le supplément de 128 les nombres/points de code rendus disponibles par cette extension seraient mappés en différents caractères selon la langue affichée. Les normes ISO-8859 sont les formes les plus courantes de cette cartographie; ISO-8859-1 et ISO-8859-15 (également connu sous ISO-Latin-1, latin1, et oui il existe deux versions différentes de la norme ISO 8859 aussi bien).

mais ce n'est pas suffisant quand vous voulez représenter des caractères de plus d'une langue, donc en un seul octet ne marchera pas.

il existe essentiellement deux types d'encodages différents: l'un élargit la gamme de valeurs en ajoutant plus de bits. Des exemples de ces encodages seraient UCS2 (2 octets = 16 bits) et UCS4 (4 octets = 32 bits). Ils souffrent de manière inhérente du même problème que les standards ASCII et ISO-8859, car leur gamme de valeurs est encore limitée, même si la limite est beaucoup plus élevée.

L'autre type de codage utilise un nombre variable d'octets par le caractère, et les encodages les plus connus pour cela sont les encodages UTF. Tous les encodages UTF fonctionnent à peu près de la même manière: vous choisissez une taille d'unité, qui pour UTF-8 est de 8 bits, pour UTF-16 est de 16 bits, et pour UTF-32 est de 32 bits. La norme définit ensuite quelques-uns de ces bits comme des drapeaux: s'ils sont définis, alors l'unité suivante dans une séquence d'unités doit être considérée comme faisant partie du même caractère. S'ils ne sont pas définis, cette unité représente un caractère complet. Ainsi les caractères les plus communs (anglais) n'occupent qu'un octet en UTF-8 (deux en UTF-16, 4 en UTF-32), mais les autres caractères de langue peuvent occuper six octets ou plus.

les encodages Multi-octets (je dirais multi-unités après l'explication ci-dessus) ont l'avantage d'être relativement peu encombrants, mais l'inconvénient que les opérations telles que la recherche de substrats, comparaisons, etc. tous doivent décoder les caractères en points de code unicode avant que de telles opérations puissent être effectuées (il y a cependant quelques raccourcis).

les normes UCS et UTF codent les points de code définis dans Unicode. En théorie, ces encodages pourraient être utilisés pour encoder n'importe quel nombre (dans la gamme des supports d'encodage) - mais bien sûr ces encodages ont été faits pour encoder des points de code Unicode. Et c'est votre relation qui existe entre eux.

Windows gère les chaînes dites "Unicode" en tant que chaînes UTF-16, alors que la plupart des UNIXes sont par défaut UTF-8 de nos jours. Les protocoles de communication comme HTTP tendent à mieux fonctionner avec UTF-8, comme la taille de l'unité dans UTF-8 est la même que dans ASCII, et la plupart de ces protocoles ont été conçus dans l'ère ASCII. D'autre part, UTF-16 donne la meilleure moyenne espace/traitement de performance quand représentant toutes les langues vivantes.

la norme Unicode définit moins de points de code que ceux qui peuvent être représentés en 32 bits. Ainsi, à toutes fins pratiques, UTF-32 et UCS4 sont devenus le même encodage, car vous êtes il est peu probable que vous ayez à composer avec des caractères à unités multiples en UTF-32.

l'Espérance qui comble dans certains détails.

398
répondu 0x499602D2 2013-08-27 03:16:04

"Unicode" est malheureusement utilisé de différentes manières, selon le contexte. Son utilisation la plus correcte (IMO) est comme un jeu de caractères codés - c.-à-d. un ensemble de caractères et une cartographie entre les caractères et un entier points de code les représentant.

UTF-8 est un codage de caractères - une façon de convertir des séquences d'octets en séquences de caractères et vice versa. Il couvre la l'ensemble du jeu de caractères Unicode. ASCII est codé comme un seul octet par caractère, et les autres caractères prennent plus d'octets en fonction de leur point de code exact (jusqu'à 4 octets pour tous les points de code actuellement définis, c.-à-d. jusqu'à U-0010FFFF, et en effet 4 octets pourraient faire face à jusqu'à U-001FFFFF).

lorsque" Unicode "est utilisé comme nom d'un encodage de caractères (par exemple comme encodage .NET ).Unicode propriété) signifie habituellement UTF-16 , qui code les caractères les plus communs comme deux octets. Certaines plateformes (notamment .NET et Java) utilisent UTF-16 comme encodage de caractères "natifs". Cela entraîne des problèmes si vous devez vous soucier des caractères qui ne peuvent pas être encodés dans une seule valeur UTF-16 (Ils sont encodés en tant que "paires de substitution") - mais la plupart des développeurs ne s'inquiètent jamais à ce sujet, IME.

quelques références sur Unicode:

178
répondu Jon Skeet 2018-09-11 13:39:45

Permettez-moi d'utiliser un exemple pour illustrer ce sujet:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Rien de magique jusqu'à présent, c'est très simple. Maintenant, disons que vous décidez de stocker ce personnage sur notre disque dur. Pour ce faire, nous avons besoin de stocker le caractère en format binaire. Nous pouvons tout simplement le stocker comme il est "01101100 01001001". Fait!

mais attendez une minute, est-ce que '01101100 01001001' est un ou deux caractères? Tu savais que c'était un personnage parce que je te l'ai dit, Mais quand l'ordinateur le lit, il n'en a aucune idée. Nous avons donc besoin d'une sorte de "codage" pour dire à l'ordinateur de le traiter comme tel.

c'est ici que les règles de "UTF-8" entrent en jeu: http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

selon le tableau ci-dessus, si nous voulons stocker ce caractère en utilisant le format 'UTF-8', nous devons préfixer notre caractère avec quelques 'en-têtes'. Notre caractère chinois est long de 16 bits (compter le binaire valeur vous-même), nous allons donc utiliser le format sur la rangée 3 car il fournit assez d'espace:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Écrit le résultat dans une seule ligne:

11100110 10110001 10001001

C'est la valeur UTF-8 (binaire) du caractère chinois! (confirmez vous-même: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

résumé

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001
163
répondu Cheng 2015-02-25 05:52:52

ce n'est pas la même chose - UTF-8 est une façon particulière d'encoder Unicode.

Il y a beaucoup d'encodages différents que vous pouvez choisir en fonction de votre application et les données que vous souhaitez utiliser. Les plus communs sont UTF-8, UTF-16 et UTF-32, autant que je sache.

104
répondu Greg 2009-03-13 17:09:23

Unicode définit seulement points de code , c'est-à-dire un nombre qui représente un caractère. La façon dont vous stockez ces points de code en mémoire dépend du encodage que vous utilisez. UTF-8 est une façon d'encoder les caractères Unicode, parmi beaucoup d'autres.

56
répondu Martin Cote 2009-03-13 17:14:36

Unicode est une norme qui définit, avec la norme ISO/CEI 10646, Universal Character Set (UCS) qui est un surensemble de tous les caractères existants requis pour représenter pratiquement toutes les langues connues.

Unicode assigne un nom et un numéro ( code de caractère , ou Code-Point ) à chaque personnage de son répertoire.

encodage UTF-8 , est une façon de représenter numériquement ces caractères dans la mémoire de l'ordinateur. UTF-8 mappe chaque point de code en une séquence d'octets (octets 8 bits)

pour p.ex.,

UCS Caractères = Unicode Han Caractère

code UCS-point = U+24B62

encodage UTF-8 = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)

26
répondu nightlytrails 2014-09-27 00:30:49

Unicode est juste une norme qui définit un jeu de caractères ( UCS ) et des encodages ( UTF ) pour encoder ce jeu de caractères. Mais en général, Unicode se réfère au jeu de caractères et non à la norme.

Lire Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères (Pas d'Excuses!) et Unicode en 5 Minutes .

23
répondu Gumbo 2009-03-13 17:37:07

les réponses existantes expliquent déjà beaucoup de détails, mais voici une réponse très courte avec l'explication la plus directe et l'exemple.

Unicode est le standard qui correspond aux caractères codépoints.

Chaque caractère a un codepoint unique (numéro d'identification), qui est un numéro comme 9731.

UTF-8 est un le encodage des codépoints.

Afin de stocker tous les caractères sur le disque (dans un fichier), UTF-8 divise les caractères en un maximum de 4 octets (séquences de 8 bits)-octets. UTF-8 est l'un de plusieurs codages (méthodes de représentation des données). Par exemple, en Unicode, Le (décimal) codepoint 9731 représente un bonhomme de neige ( ), qui se compose de 3 octets en UTF-8: E2 98 83

Voici une liste triée avec certains exemples aléatoires .

19
répondu basic6 2017-05-23 11:55:19

1. Unicode

il y a beaucoup de personnages dans le monde, comme"$,&, h, a, t,?,1,=,+...".

puis il y a une organisation qui se consacre à ces personnages,

ils ont fait un standard appelé "Unicode".

la norme est comme suit:

  • créer une forme dans laquelle chaque position est appelée"point de code", ou"position de code".
  • Les positions entières sont de U+0000 à U+10FF;
  • jusqu'à présent,certaines positions sont remplies de caractères,et d'autres sont sauvegardées ou vides.
  • par exemple,la position" U+0024 "est remplie avec le caractère"$".

PS: bien sûr, il y a une autre organisation appelée ISO maintenant une autre norme --"ISO 10646".

2. UTF-8

As ci-dessus,U+0024 est juste une position, donc nous ne pouvons pas enregistrer "U+0024" dans l'ordinateur pour le caractère "$".

il doit y avoir une méthode d'encodage.

viennent ensuite les méthodes d'encodage, telles que UTF-8, UTF-16, UTF-32, UCS-2....

sous UTF-8, le point de code "U+0024" est encodé en 00100100.

00100100 est la valeur que nous enregistrons dans l'ordinateur pour "$".

13
répondu wengeezhang 2017-09-26 05:06:04

j'ai vérifié les liens dans la réponse de Gumbo, et je voulais coller une partie de ces choses ici pour exister sur le débordement de pile aussi bien.

"...Certaines personnes pensent à tort Qu'Unicode est simplement un code 16 bits où chaque caractère prend 16 bits et il y a donc 65.536 caractères possibles. Ce n'est pas, en fait, de les corriger. C'est le mythe le plus courant sur Unicode, donc si vous pensez que, ne vous sentez pas mal.

en fait, Unicode a une façon différente de penser les personnages, et vous devez comprendre la façon Unicode de penser des choses ou rien n'aura de sens.

Jusqu'à présent, nous avons supposé qu'une lettre correspond à quelques bits que vous pouvez stocker sur

12
répondu