web-dev-qa-db-fra.com

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

J'ai entendu des opinions contradictoires de personnes - selon la page Wikipedia UTF-8 .

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

440
sarsnake

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 des nombres tels que des octets ... en sautant un peu d’histoire ici et en ignorant les problèmes d’adressage de la mémoire, les ordinateurs 8 bits traiteraient un octet en 8 bits comme la plus grande unité numérique facilement représentée sur le matériel, tandis que les ordinateurs 16 bits s’étendraient. cela à deux octets, et ainsi de suite.

Les anciens codages de caractères, tels que ASCII, datent de l’ère (antérieure) à 8 bits et tentent de coder la langue dominante en informatique, c’est-à-dire l’anglais, en nombres allant de 0 à 127 (7 bits). ) Avec 26 lettres dans l'alphabet, en majuscules et en minuscules, des chiffres et des signes de ponctuation, cela a fonctionné assez bien. ASCII a été étendu d'un 8ème bit pour d'autres langues autres que l'anglais, mais les 128 numéros/points de code supplémentaires rendus disponibles par cette extension seraient mappés sur différents caractères en fonction de 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 connues sous le nom de ISO-Latin-1, latin1 et oui, il existe deux versions différentes de la norme ISO 8859).

Mais cela ne suffit pas lorsque vous souhaitez représenter des caractères de plusieurs langues, il est donc inutile de regrouper tous les caractères disponibles dans un seul octet.

Il existe essentiellement deux types différents d'encodages: l'un étend la plage de valeurs en ajoutant plus de bits. UCS2 (2 octets = 16 bits) et UCS4 (4 octets = 32 bits) sont des exemples de ces codages. Ils souffrent du même problème que les normes ASCII et ISO-8859, car leur plage de valeurs est toujours limitée, même si la limite est considérablement supérieure.

L’autre type de codage utilise un nombre variable d’octets par caractère, les codages les plus connus étant les codages UTF. Tous les codages UTF fonctionnent à peu près de la même manière: vous choisissez une taille d’unité, qui est de 8 bits pour UTF-8, de 16 bits pour UTF-16 et de 32 bits pour UTF-32. La norme définit ensuite quelques-uns de ces bits en tant qu'indicateurs: s'ils sont définis, l'unité suivante d'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 à part entière. Ainsi, les caractères (anglais) les plus courants n'occupent qu'un octet en UTF-8 (deux en UTF-16, 4 en UTF-32), mais les caractères d'une autre langue peuvent occuper six octets ou plus.

Les codages sur plusieurs octets (je devrais dire plusieurs unités après l'explication ci-dessus) ont l'avantage d'être relativement peu encombrants, mais l'inconvénient est que les opérations telles que la recherche de sous-chaînes, les comparaisons, etc. doivent toutes décoder les caractères en code unicode. points avant que de telles opérations puissent être effectuées (il existe cependant quelques raccourcis).

Les normes UCS et les normes UTF codent les points de code tels que définis dans Unicode. En théorie, ces codages pourraient être utilisés pour coder n’importe quel nombre (dans la gamme des supports de codage) - mais ces codages ont bien sûr été conçus pour coder des points de code Unicode. Et c'est votre relation entre eux.

Windows traite les chaînes dites "Unicode" en tant que chaînes UTF-16, tandis que la plupart des UNIX par défaut sont UTF-8 de nos jours. Les protocoles de communication tels que HTTP fonctionnent généralement mieux avec UTF-8, car la taille de l'unité dans UTF-8 est identique à celle de l'ASCII et la plupart de ces protocoles ont été conçus à l'époque ASCII. D'autre part, UTF-16 donne la meilleure performance d'espace moyenne lors de la représentation de toutes les langues vivantes.

La norme Unicode définit moins de points de code que ce qui peut être représenté sur 32 bits. Ainsi, à toutes fins pratiques, UTF-32 et UCS4 sont devenus le même encodage, car il est peu probable que vous ayez à traiter avec des caractères à plusieurs unités dans UTF-32.

J'espère que cela remplit certains détails.

439
unwesen

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

TF-8 est un codage de caractères - un moyen de convertir des séquences d'octets en séquences de caractères et inversement. Il couvre l’ensemble du jeu de caractères Unicode. ASCII est codé sous forme d'octet unique par caractère et les autres caractères prennent plus d'octets en fonction de leur code exact (jusqu'à 4 octets pour tous les points de code actuellement définis, c'est-à-dire jusqu'à U-0010FFFF et effectivement 4). les octets peuvent traiter jusqu’à U-001FFFFF).

Lorsque "Unicode" est utilisé comme nom d'un codage de caractères (par exemple, la propriété .NET Encoding.Unicode ), cela signifie généralement TF-16 , qui code les caractères les plus courants. comme deux octets. Certaines plates-formes (notamment .NET et Java) utilisent UTF-16 comme encodage de caractères "natif". Cela pose des problèmes épineux 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 de cela, IME.

Quelques références sur Unicode:

193
Jon Skeet

Me laisser 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 nous décidons de stocker ce personnage sur notre disque dur. Pour ce faire, nous devons stocker le caractère au format binaire. Nous pouvons simplement le stocker tel quel '01101100 01001001'. Terminé!

Mais attendez une minute, est '01101100 01001001' un ou deux caractères? Vous saviez que c'était un personnage parce que je vous l'avais dit, mais quand un ordinateur le lit, il n'en a aucune idée. Nous avons donc besoin d’une sorte d’encodage pour dire à l’ordinateur de le traiter comme tel.

C’est là que les règles de 'UTF-8' entrent en vigueur: 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 des "en-têtes". Notre caractère chinois est long de 16 bits (comptez la valeur binaire vous-même), nous allons donc utiliser le format de la ligne 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

Écrire le résultat en une ligne:

11100110 10110001 10001001

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

Sommaire

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

P.S. Si vous voulez apprendre ce sujet en python, cliquez ici

190
Cheng

Ce n'est pas la même chose - UTF-8 est une manière particulière de coder Unicode.

Vous pouvez choisir parmi de nombreux encodages en fonction de votre application et des données que vous souhaitez utiliser. Les plus courants sont UTF-8, UTF-16 et UTF-32, autant que je sache.

107
Greg

Unicode ne définit que points de code, c’est-à-dire un nombre représentant 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 un moyen d'encoder des caractères Unicode parmi beaucoup d'autres.

63
Martin Cote

Unicode est une norme qui définit, avec ISO/IEC 10646, le jeu de caractères universel (UCS) qui est un sur-ensemble de tous les caractères existants nécessaires pour représenter pratiquement toutes les langues connues.

Unicode attribue un nom et un numéro ( code de caractère ou code-point ) à chaque caractère de son répertoire.

Le codage UTF-8 est un moyen 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 de 8 bits)

Pour, par exemple,

Caractère UCS = caractère Unicode Han

Point de code UCS = U + 24B62

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

29
nightlytrails

nicode est juste une norme qui définit un jeu de caractères ( UCS ) et des codages ( UTF ) pour coder ce jeu de caractères. Mais en général, Unicode est référé au jeu de caractères et non au standard.

Lire Le minimum absolu que chaque développeur de logiciel a absolument, doit absolument savoir sur Unicode et les jeux de caractères (sans excuses!) et nicode en 5 minutes .

24
Gumbo

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

Unicode est le standard qui mappe les caractères en points de code.
Chaque caractère a un code unique (numéro d’identification), qui correspond à 9731.

UTF-8 est un le  codage des points de code.
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 des nombreux codages (méthodes de représentation des données). Par exemple, en Unicode, le point de code (décimal) 9731 représente un bonhomme de neige (), composé de 3 octets en UTF-8: E2 98 83

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

21
basic6

1. Unicode

Il y a beaucoup de personnages à travers le monde, comme "$, &, h, a, t,?, 张, 1, =, + ...".

Vient ensuite une organisation dédiée à ces personnages,

Ils ont créé une norme appelée "Unicode".

La norme est comme suit:

  • créez un formulaire dans lequel chaque position est appelée "point de code" ou "position de code".
  • Les positions entières vont de U + 0000 à U + 10FFFF;
  • Jusqu'à présent, certains postes sont remplis de caractères et d'autres sont enregistrés ou vides.
  • Par exemple, la position "U + 0024" est remplie avec le caractère "$".

PS: Bien sûr, une autre organisation appelée ISO maintient une autre norme - "ISO 10646" - presque la même chose.

2. UTF-8

Comme ci-dessus, U + 0024 est juste une position, nous ne pouvons donc 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 de codage telles que UTF-8, UTF-16, UTF-32, UCS-2 ....

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

00100100 est la valeur que nous économisons en ordinateur pour "$".

15
wengeezhang

J'ai vérifié les liens dans la réponse de Gumbo, et je voulais aussi en coller une partie pour exister sur Stack Overflow.

"... Certaines personnes pensent à tort qu'Unicode est simplement un code 16 bits dans lequel chaque caractère prend 16 bits, ce qui donne 65 536 caractères possibles. Ce n'est pas, en fait, tout à fait correct. C'est le mythe le plus répandu à propos d'Unicode. Donc, si vous pensiez cela, ne vous sentez pas mal.

En fait, Unicode a une manière de penser différente sur les caractères et vous devez comprendre la façon dont Unicode pense les choses, sinon rien n’aura de sens.

Jusqu'à présent, nous avons supposé qu'une lettre correspond à des bits que vous pouvez stocker sur le disque ou en mémoire:

A -> 0100 0001

En Unicode, une lettre correspond à un point appelé code, qui n’est encore qu’un concept théorique. Comment ce point de code est représenté en mémoire ou sur disque est une toute autre histoire ... "

"... Le consortium Unicode attribue un chiffre magique à chaque lettre platonique de chaque alphabet: U + 0639. Ce numéro magique est appelé un point de code. U + signifie" Unicode "et les nombres sont hexadécimaux. U + 0639 est la lettre arabe Ain. La lettre anglaise A serait U + 0041 .... "

"... OK, disons que nous avons une chaîne:

Salut

qui, en Unicode, correspond à ces cinq points de code:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Juste un tas de points de code. Les chiffres, vraiment. Nous n'avons encore rien dit sur la façon de stocker cela en mémoire ou de le représenter dans un email ... "

"... C'est là qu'interviennent les encodages.

La première idée pour le codage Unicode, qui a conduit au mythe relatif aux deux octets, était, hé, stockons simplement ces nombres dans deux octets chacun. Alors Bonjour devient

00 48 00 65 00 6C 00 6C 00 6F

Droite? Pas si vite! Ne pourrait-il pas être aussi:

48 00 65 00 6C 00 6C 00 6F 00? ... "

12
kommradHomer

nicode est une norme à large portée qui définit plus de 130 000 caractères et attribue à chacun un code numérique (un "point de code"). Il définit également des règles sur la manière de trier, normaliser, modifier la casse de ce texte, etc. Un caractère en Unicode est représenté par un point de code compris entre zéro et 0x10FFFF inclus, bien que certains points de code soient réservés et ne puissent pas être utilisés pour des caractères.

Les codes en Unicode peuvent être représentés dans plusieurs codages. Le plus simple est UTF-32, qui code simplement le point de code sous forme d'entiers de 32 bits, chacun d'une largeur de 4 octets.

TF-8 est un autre encodage qui devient rapidement le standard de facto. Il code comme une séquence de valeurs d'octets. Chaque point de code peut utiliser un nombre variable de ces octets. Les points de code dans la plage ASCII sont codés nus pour être compatibles avec ASCII. Les points de code situés en dehors de cette plage utilisent un nombre d'octets variable, 2, 3 ou 4, en fonction de la plage dans laquelle ils se trouvent.

UTF-8 a été conçu avec ces propriétés à l'esprit:

  • Les caractères ASCII sont codés exactement comme ils le sont en ASCII, de sorte qu'une chaîne ASCII est également valide au format UTF-8.

  • Tri binaire: le tri des chaînes UTF-8 à l'aide d'un tri binaire naïf aura toujours pour résultat que tous les points de code seront triés par ordre numérique.

  • Les caractères en dehors de la plage ASCII n'utilisent pas d'octets dans la plage ASCII, ce qui garantit qu'ils ne peuvent pas être confondus avec les caractères ASCII. C'est aussi un élément de sécurité.

  • UTF-8 peut être facilement validé et distingué des autres encodages de caractères par un validateur. Le texte dans d'autres codages 8 bits ou codés sur plusieurs octets sera très rarement validé également en tant que UTF-8.

  • Accès aléatoire: à tout moment de la chaîne UTF-8, il est possible de déterminer si l'octet situé à cette position est le premier octet d'un caractère ou non, et de revenir en arrière au début de ce caractère, sans avoir à se référer à rien. le début de la chaîne.

3
thomasrutter

Ils sont la même chose, n'est-ce pas?

Non, ils ne le sont pas.


Je pense que la première phrase du page Wikipedia que vous avez citée donne un bref résumé agréable:

UTF-8 est un codage de caractères de largeur variable capable de coder tous les 1 112 064 points de code valides d'Unicode en utilisant un à quatre octets de 8 bits.

Élaborer:

  • Unicode est un standard qui définit un mappage de caractères en chiffres , les soi-disant points de code (comme dans l'exemple ci-dessous). Pour la cartographie complète, vous pouvez jeter un oeil ici .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 est l’un des moyens de coder ces points de code en sous une forme qu’un ordinateur peut comprendre, à savoir bits . En d'autres termes, c'est un moyen/algorithme de convertir chacun de ces points de code en une séquence de bits ou de convertir une séquence de bits en points de code équivalents. Notez qu'il existe de nombreux codages alternatifs pour Unicode.


Joel donne une très belle explication et un aperçu de l'histoire ici .

1
Dimos

Si je peux résumer ce que j'ai recueilli de ce fil de discussion:

Unicode 'traduit' caractères en nombres ordinaux (sous forme décimale).

à = 224

UTF-8 est un encodage qui "traduit" ces nombres en représentations binaires .

224 = 11000011 10100000
0
Raimi bin Karim

TF-8 est une méthode de codage de caractères Unicode utilisant des séquences de 8 bits.

nicode est un standard permettant de représenter une grande variété de caractères de plusieurs langues.

0
akaMahesh