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

505

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

C'est la même chose, non? Quelqu'un peut-il clarifier?

serpent
la source
1
Ce que ce WIKI écrit sur l'unicode et les UTF est correct à mon avis. Certains commentaires à ce sujet sont bizarres: "Il est possible en UTF-8 (ou tout autre codage multi-octets) de diviser ou de tronquer une chaîne au milieu d'un caractère, ce qui peut entraîner une chaîne non valide." Ainsi, une chaîne qui est encodée en UTF-8 n'est plus une chaîne mais un tableau d'octets ou un flux d'octets. Les caractères qui composent la chaîne sont encodés. Bien sûr, il peut également être décodé. Maintenant, bien sûr, vous pouvez couper une séquence utf-8 après l'octet de départ ou après un octet suivant, mais pourquoi quelqu'un devrait-il faire cela?
brighty
Cet article sur les types de données de chaîne est éducatif: mortoray.com/2013/11/27/the-string-type-is-broken - parfois lorsque vous travaillez avec des chaînes et leurs composants de niveau octet, vous pouvez par inadvertance hacher un caractère en deux .
Everett

Réponses:

497

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 les 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 de 8 bits comme la plus grande unité numérique facilement représentée sur le matériel, les ordinateurs 16 bits se développeraient cela à deux octets, et ainsi de suite.

Les anciens codages de caractères tels que ASCII sont de l'ère (pré-) 8 bits et tentent de caser 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 sous forme majuscule et non capitale, des chiffres et des signes de ponctuation, cela a plutôt bien fonctionné. ASCII a été étendu d'un 8e bit pour les autres langues non anglaises, mais les 128 numéros / points de code supplémentaires rendus disponibles par cette extension seront 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 connu sous le nom ISO-Latin-1, latin1, et oui, il existe également deux versions différentes de la norme ISO 8859).

Mais cela ne suffit pas lorsque vous souhaitez représenter des caractères de plus d'une langue, donc entasser tous les caractères disponibles dans un seul octet ne fonctionnera tout simplement pas.

Il existe essentiellement deux types de codages différents: l'un étend la plage de valeurs en ajoutant plus de bits. Des exemples de ces codages seraient UCS2 (2 octets = 16 bits) et UCS4 (4 octets = 32 bits). Ils souffrent intrinsèquement 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 beaucoup plus élevée.

L'autre type de codage utilise un nombre variable d'octets par caractère, et les codages les plus connus sont les codages 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, 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 pleinement un caractère. Ainsi, les caractères les plus courants (anglais) n'occupent qu'un octet en UTF-8 (deux en UTF-16, 4 en UTF-32), mais d'autres caractères de langue peuvent occuper six octets ou plus.

Les codages multi-octets (je devrais dire 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 sous-chaînes, les comparaisons, etc. doivent toutes décoder les caractères en code unicode points avant que de telles opérations ne puissent être effectuées (il existe cependant des raccourcis).

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

Windows gère les chaînes dites "Unicode" comme des chaînes UTF-16, alors que la plupart des UNIX utilisent par défaut 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é en UTF-8 est la même qu'en ASCII, et la plupart de ces protocoles ont été conçus à l'ère ASCII. D'un autre côté, UTF-16 offre les meilleures performances moyennes d' espace / traitement 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 à gérer des caractères à plusieurs unités en UTF-32.

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

Scott Tesler
la source
9
Conceptuellement, UCS-2 et UCS-4 sont des jeux de caractères , pas des encodages de caractères (d'où le nom).
Escargot mécanique
74
@Tuukka Les erreurs dans cette publication sont légion. Il y a plus que 2 versions d'ISO 8859. ASCII ne fonctionnait pas pour l'anglais, manquant des choses comme les guillemets bouclés, les signes cent, les accents, et bien plus encore - Unicode n'est pas seulement non-anglais; L'anglais en a aussi besoin !! Aucun point de code n'occupe plus de 4 octets dans TOUT codage; cette entreprise de 6 octets est complètement fausse. Vous ne pouvez pas encoder en UTF une valeur scalaire Unicode comme cela dit: les substituts et les 66 autres non-caractères sont tous interdits. UCS-4 et UTF-32 ne sont pas les mêmes. Il n'y a pas de UTF-32 multi-unités. L'UTF-16 n'est pas aussi efficace qu'ils le prétendent - & c & c & c!
tchrist
1
ASCII ne contient pas non plus le signe dièse £, et bien sûr ne contient pas le signe euro € (qui est considérablement plus jeune que ASCII).
TRiG
1
@tchrist Il semble que 6 octets ne sont pas improbables après tout. Voir ceci: joelonsoftware.com/articles/Unicode.html qui indique qu'il y a un espace de caractères de 0x04000000à 0x7FFFFFFF, ou en binaire c'est 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv - et c'est en effet 6 octets. Cependant, 6 octets est le maximum , et non pas comme l'article prétend confusément "six octets ou plus ".
erreur de syntaxe
12
@syntaxerror: "Seuls les points de code 128 et supérieurs sont stockés en utilisant 2, 3, en fait, jusqu'à 6 octets." était exacte une fois écrite, mais plus tard la même année (il y a douze ans), elle a été invalidée. en.wikipedia.org/wiki/UTF-8 dit "La spécification d'origine couvrait des nombres jusqu'à 31 bits (la limite d'origine du jeu de caractères universel). En novembre 2003, l'UTF-8 a été restreint par la RFC 3629 pour se terminer en U + 10FFFF, afin de respecter les contraintes du codage de caractères UTF-16. Cela a supprimé toutes les séquences de 5 et 6 octets, et environ la moitié des séquences de 4 octets. "
Mooing Duck
237

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'ici, 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, '01101100 01001001' est-il un ou deux caractères? Vous saviez que c'est un personnage parce que je vous l'ai dit, mais quand un 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 un.

C'est là qu'interviennent les règles de 'UTF-8': 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 mesure 16 bits (comptez vous-même la valeur binaire), nous utiliserons donc le format de la ligne 3 car il offre suffisamment 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 sur une seule ligne:

11100110 10110001 10001001

Il s'agit de 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

PS Si vous voulez apprendre ce sujet en python, cliquez ici

Cheng
la source
6
"Mais attendez une minute, est-ce que '01101100 01001001' est un caractère ou deux caractères? Vous saviez que c'est un caractère parce que je vous l'ai dit, mais quand un ordinateur le lit, il n'a aucune idée. Nous avons donc besoin d'une sorte de" codage "pour dites à l'ordinateur de le traiter comme un. " Bon ok, mais l'ordinateur ne sait toujours pas qu'il devrait le coder avec utf-8?
Koray Tugay
15
@KorayTugay L'ordinateur ne sait pas quel encodage il doit utiliser. Vous devez le dire lorsque vous enregistrez un caractère dans un fichier et également lorsque vous lisez un caractère dans un fichier.
Cheng
3
@Connor L'ordinateur ne sait pas quel format utiliser. Lorsque vous enregistrez le document, l'éditeur de texte doit définir explicitement son encodage sur utf-8 ou sur le format que l'utilisateur souhaite utiliser. De plus, lorsqu'un programme d'édition de texte lit un fichier, il doit sélectionner un schéma de codage de texte pour le décoder correctement. Il en va de même lorsque vous tapez et saisissez une lettre, l'éditeur de texte doit savoir quel schéma vous utilisez pour qu'il l'enregistre correctement.
Cheng
2
Alors, comment ces en-têtes sont-ils interprétés? si je regarde le premier tableau alors je pense: si l'octet commence par le bit 0alors le caractère est représenté par 1 morsure (le courant), si l'octet commence par 110alors le caractère est représenté par 2 octets (le courant et le suivant ( bits restants après 10)), si l'octet commence par 1110alors le caractère est représenté par 3 octets, le courant et les 2 octets suivants (bits restants après 10).
JBoy
2
Lisez 10 articles sur UTF-8; après avoir lu ceci, j'ai compris en 10 secondes :)
jrhee17
201

"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'est-à-dire un jeu de caractères et un mappage entre les caractères et les points de code entiers les représentant.

UTF-8 est un codage de caractères - un moyen de convertir des séquences d'octets en séquences de caractères et vice versa. Il couvre l'ensemble du jeu de caractères Unicode. ASCII est codé comme un seul octet par caractère, et d'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'est-à-dire jusqu'à U-0010FFFF, et en fait 4 octets pourraient supporter jusqu'à U-001FFFFF).

Lorsque "Unicode" est utilisé comme nom d'un codage de caractères (par exemple en tant que propriété .NET Encoding.Unicode ), cela signifie généralement UTF-16 , qui code les caractères les plus courants sur deux octets. Certaines plateformes (notamment .NET et Java) utilisent UTF-16 comme encodage de caractères "natif". Cela conduit à des problèmes poilus 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 se soucient jamais de cela, IME.

Quelques références sur Unicode:

Jon Skeet
la source
16
Je pense que UTF-16 n'est égal qu'à "Unicode" sur les plates-formes Windows. Les gens ont tendance à utiliser UTF-8 par défaut sur * nix. +1 cependant, bonne réponse
jalf
10
@Chris: Non, ISO-8859-1 n'est pas UTF-8. UTF-8 code U + 0080 en U + 00FF en deux octets, pas un. Windows 1252 et ISO-8859-1 sont essentiellement les mêmes, mais ils diffèrent entre les valeurs 0x80 et 0x99 si je me souviens bien, où ISO 8859-1 a un "trou" mais CP1252 définit les caractères.
Jon Skeet
13
L'idée d'appeler UTF-16 "Unicode" me gêne en raison de son potentiel de confusion - même si cela a été clairement indiqué comme une convention .NET uniquement. UTF-16 est une façon de représenter Unicode, mais ce n'est pas "le codage Unicode".
thomasrutter
6
@unwesen: UTF-8 n'a pas besoin de paires de substitution. Il représente simplement les caractères non BMP en utilisant des séquences d'octets progressivement plus longues.
Jon Skeet
5
@RoyiNamir: Oui, "Unicode" est malheureusement souvent utilisé pour signifier "UTF-16" en particulier dans Windows.
Jon Skeet
108

Ce n'est pas la même chose - UTF-8 est un moyen particulier d'encoder Unicode.

Vous pouvez choisir parmi de nombreux encodages différents en fonction de votre application et des données que vous avez l'intention d'utiliser. Les plus courants sont les UTF-8, UTF-16 et UTF-32 à ma connaissance.

Greg
la source
10
cependant, le fait est que certains éditeurs proposent d'enregistrer le fichier sous "Unicode" OU "UTF-8". Donc, la mention de cet "Unicode" dans ce cas est UTF-16, je pense nécessaire.
serhio
71

Unicode ne définit que des 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 codage que vous utilisez. UTF-8 est un moyen d'encoder des caractères Unicode, parmi beaucoup d'autres.

Martin Cote
la source
2
cependant, le fait est que certains éditeurs proposent d'enregistrer le fichier sous "Unicode" OU "UTF-8". Donc, la mention de cet "Unicode" dans ce cas est UTF-16, je pense nécessaire.
serhio
Un nombre, qui présente un caractère, fait également de l'ASCII.
brighty
6
lisez ceci avant et après avoir regardé le reste des réponses sur cette page
Dodgie
33

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 requis pour représenter pratiquement toutes les langues connues.

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

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

Par exemple,

Caractère UCS = caractère Han Unicode

Point de code UCS = U + 24B62

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

sentiers nocturnes
la source
Non, UTF-8 mappe uniquement les points de code dans une séquence supérieure à 127. Tout de 0 à 127 n'est pas une séquence mais un seul octet. Btw, ASCII attribue également un nom de caractère à un nombre, c'est donc la même chose que Unicode. Mais Unicode ne s'arrête pas au point de code 127 mais monte jusqu'à 0x10ffff.
brighty
2
@brightly je diffère. Les caractères ascii sont en effet mappés sur une séquence d'un seul octet. Le premier bit, qui est 0 dans le cas du code pour les caractères ascii, indique combien d'octets suivent - zéro. http://www.wikiwand.com/en/UTF-8#/DescriptionJetez un œil à la première rangée.
nightlytrails
Eh bien, pour moi, une séquence se compose de plus d'un octet. Un caractère ASCII dans UTF-8 est un seul octet tel quel, avec le bit le plus significatif mis à 0. Les points de code supérieurs à 127 ont alors besoin de séquences, qui ont toujours un octet de départ et un, deux ou trois octets suivants. Alors pourquoi appelleriez-vous un seul octet une "séquence"?
brighty
Eh bien ... Plusieurs fois, les avocats de langue anglaise peuvent être déconcertés par leur mauvaise utilisation intentionnelle dans les logiciels. C'est le même cas ici. Vous pouvez en discuter. Mais cela ne sera pas plus clair.
nightlytrails
1
@brighty Hmmm, En mathématiques, une séquence de 0 éléments est OK. Une séquence de 1 élément est très bien ici aussi.
chux
24

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

Lisez le minimum absolu Chaque développeur de logiciels doit absolument, positivement, connaître Unicode et les jeux de caractères (pas d'excuses!) Et Unicode en 5 minutes .

Gombo
la source
1
@serhio: Je sais. Bien qu'il existe trois codages UTF-16 différents: les deux UTF-16LE et UTF-16BE explicites et l' UTF-16 implicite où l'endianité est spécifiée avec une nomenclature.
Gumbo
@Gumbo: L'absence de nomenclature ne signifie pas qu'il s'agit d'un encodage différent. Il n'y a que deux encodages.
Mooing Duck
Le blog ci-dessus est écrit par le PDG de Stakcoverflow.
Shailesh Pratapwar
23

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 la norme qui mappe les caractères aux points de code.
Chaque caractère a un point de code unique (numéro d'identification), qui est un nombre comme 9731.

UTF-8 est 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 encodages (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 ( ), qui se compose de 3 octets en UTF-8:E2 98 83

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

basic6
la source
1
Non! UTF-8 est un bon moyen d'encoder des caractères unicode mais nous pouvons également encoder en UTF-16 ou UTF-32. Avec UTF-32, nous avons une relation 1: 1 entre DWORD et codepoint, avec UTF-16, nous avons une relation 1: 1 entre WORD et codepoint uniquement pour les codepoints du BMP, à l'exclusion des substituts et des nomenclatures. En UTF-8, nous avons une relation 1: 1 entre l'octet et le point de code juste pour les points de code <127.
brighty
5
@brighty: D'accord, mais pourquoi "non!"? J'ai écrit "UTF-8 est l'un des nombreux encodages" car il existe également UTF-16 et UTF-32.
basic6
16

1. Unicode

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

Puis vient une organisation qui se consacre à ces personnages,

Ils ont fait un standard appelé "Unicode".

La norme est la suivante:

  • créer un formulaire dans lequel chaque position est appelée "point de code" ou "position de code".
  • Les positions entières sont de U + 0000 à U + 10FFFF;
  • Jusqu'à présent, certaines positions sont remplies de caractères et d'autres positions sont enregistrées 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.

2. UTF-8

Comme 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 de codage.

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 codé en 00100100.

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

wengeezhang
la source
1
En général, l'UTF-8 est la seule variante que l'on utilise aujourd'hui.
Rick James
2
ISO 10646 est une norme identique au jeu de caractères Unicode. Unicode définit beaucoup de choses autres que le jeu de caractères, telles que les règles de tri, les cas, etc. ISO 10646 est juste le jeu de caractères (dont il y a actuellement plus de 130 000). Le consortium Unicode et l'ISO développent conjointement Unicode, l'ISO s'occupant uniquement du jeu de caractères et de ses encodages, et Unicode définissant également les propriétés des caractères et les règles de traitement du texte.
thomasrutter
12

J'ai vérifié les liens dans la réponse de Gumbo, et je voulais coller une partie de ces choses ici pour qu'elles existent également sur Stack Overflow.

"... Certaines personnes croient à tort que l'Unicode est simplement un code 16 bits où chaque caractère prend 16 bits et qu'il y a donc 65 536 caractères possibles. Ce n'est pas, en fait, correct. C'est le mythe le plus courant à propos d'Unicode , donc si vous pensiez cela, 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 dont Unicode pense aux choses ou rien n'aura de sens.

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

A -> 0100 0001

Dans Unicode, une lettre correspond à quelque chose appelé un point de 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 ... "

"... Chaque lettre platonique dans chaque alphabet se voit attribuer un numéro magique par le consortium Unicode qui est écrit comme ceci: U + 0639. Ce numéro magique est appelé un point de code. Le U + signifie" Unicode "et les nombres sont hexadécimaux. U + 0639 est la lettre arabe Ain. La lettre anglaise A serait U + 0041 .... "

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

Bonjour

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. Des 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 e-mail ... "

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

L'idée la plus ancienne pour le codage Unicode, qui a conduit au mythe des deux octets, était, hé, disons simplement stocker 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? ... "

kommradHomer
la source
En ASCII, une lettre correspond également à un point de code, pas seulement en unicode.
brighty
8

UTF-8 est un schéma de codage possible pour le texte Unicode .

Unicode 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 pour trier ce texte, le normaliser, modifier sa casse, etc. Un caractère en Unicode est représenté par un point de code de zéro à 0x10FFFF inclus, bien que certains points de code soient réservés et ne peuvent pas être utilisés pour les caractères.

Il existe plusieurs façons de coder une chaîne de points de code Unicode en un flux binaire. Celles-ci sont appelées "encodages". Le codage le plus simple est UTF-32 , qui stocke simplement chaque point de code sous la forme d'un entier 32 bits, chacun ayant une largeur de 4 octets.

L'UTF-8 est un autre encodage et devient de facto la norme, en raison d'un certain nombre d'avantages par rapport à l'UTF-32 et à d'autres. UTF-8 code comme une séquence de valeurs à un octet. Chaque point de code peut utiliser un nombre variable de ces valeurs d'octets. Les points de code de la plage ASCII sont codés nus, pour être compatibles avec ASCII. Les points de code en dehors de cette plage utilisent un nombre variable d'octets, soit 2, 3 ou 4, selon 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 une chaîne UTF-8 valide.

  • Tri binaire: le tri des chaînes UTF-8 à l'aide d'un tri binaire naïf entraînera toujours le tri de tous les points de code dans l'ordre numérique.

  • Les caractères nécessitant plusieurs octets ne contiennent aucune valeur d'octet dans la plage ASCII, ce qui garantit qu'une partie d'entre eux ne peut pas être confondue avec des caractères ASCII. Il s'agit également d'une fonction 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 multi-octets sera très rarement également validé comme UTF-8.

  • Accès aléatoire: à tout moment dans la chaîne UTF-8, il est possible de dire si l'octet à cette position est le premier octet d'un caractère ou non, et de trouver le début du caractère suivant ou actuel, sans avoir besoin de parcourir en avant ou en arrière de plus de quelques octets ou lire quoi que ce soit au début du flux.

thomasrutter
la source
Quelques points mineurs: [1] Les «caractères ASCII ne sont-ils pas encodés exactement comme ils sont en ASCII » ne devraient-ils pas être remplacés par «Les caractères ASCII sont encodés exactement comme ils sont en UTF-8 » ? [2] L'expression "Les codes en Unicode ..." n'est pas claire (pour moi). Voulez-vous dire "points de code Unicode ..." ?
skomisa
@skomisa pour le point 1, je voulais dire que l'encodage des caractères dans la plage ASCII est identique pour ASCII et pour UTF-8.
thomasrutter
Pour le point 2, c'est un bon point et je vais le modifier pour le rendre plus clair
thomasrutter
2

C'est la même chose, non?

Non, ils ne le sont pas.


Je pense que la première phrase de la page Wikipédia à laquelle vous avez fait référence donne un bon bref résumé:

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

Élaborer:

  • Unicode est un standard, qui définit une carte des caractères aux nombres, les points de code dits , (comme dans l'exemple ci-dessous). Pour la cartographie complète, vous pouvez jeter un œil ici .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 est l'un des moyens de coder ces points de code sous une forme qu'un ordinateur peut comprendre, alias 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 .

Dimos
la source
2

Si je peux résumer ce que j'ai rassemblé à partir de ce fil:

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

à = 224

UTF-8 est un codage qui «traduit» ces nombres en représentations binaires .

224 = 11000011 10100000

Notez que nous parlons de la représentation binaire de 224, pas de sa forme binaire, qui est 0b11100000.

remykarem
la source
2

Cet article explique tous les détails http://kunststube.net/encoding/

ÉCRITURE POUR TAMPON

si vous écrivez dans un tampon de 4 octets, symbole avec codage UTF8, votre binaire ressemblera à ceci:

00000000 11100011 10000001 10000010

si vous écrivez dans un tampon de 4 octets, symbole avec codage UTF16, votre binaire ressemblera à ceci:

00000000 00000000 00110000 01000010

Comme vous pouvez le voir, selon la langue que vous utiliseriez dans votre contenu, cela affectera votre mémoire en conséquence.

Par exemple, pour ce symbole particulier: le codage UTF16 est plus efficace car nous avons 2 octets de rechange à utiliser pour le symbole suivant. Mais cela ne signifie pas que vous devez utiliser l'alphabet UTF16 pour le Japon.

LECTURE DU TAMPON

Maintenant, si vous voulez lire les octets ci-dessus, vous devez savoir dans quel encodage il a été écrit et le décoder correctement.

Par exemple, si vous décodez ceci: 00000000 11100011 10000001 10000010 en encodage UTF16, vous vous retrouverez avec pas

Remarque: l' encodage et Unicode sont deux choses différentes. Unicode est le grand (tableau) avec chaque symbole mappé à un point de code unique. Par exemple, le symbole (lettre) a un (point de code) : 30 42 (hex). Le codage, d'autre part, est un algorithme qui convertit les symboles de manière plus appropriée, lors du stockage sur le matériel.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

entrez la description de l'image ici

InGeek
la source
très bon article lié, j'espère qu'il continuera à être actif
yolob 21
0

UTF-8 est une méthode de codage de caractères Unicode à l'aide de séquences 8 bits.

Unicode est une norme pour représenter une grande variété de caractères de nombreuses langues.

akaMahesh
la source
4
"Séquences 8 bits"…?
Je pourrais