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?
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?
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 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.
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 ".
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 )
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
0
alors le caractère est représenté par 1 morsure (le courant), si l'octet commence par 110
alors le caractère est représenté par 2 octets (le courant et le suivant ( bits restants après 10
)), si l'octet commence par 1110
alors le caractère est représenté par 3 octets, le courant et les 2 octets suivants (bits restants après 10
).
"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:
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.
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.
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)
http://www.wikiwand.com/en/UTF-8#/Description
Jetez un œil à la première rangée.
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 .
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 .
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:
PS: Bien sûr, une autre organisation appelée ISO maintient une autre norme - "ISO 10646" , presque la même.
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 "$".
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? ... "
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.
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 .
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.
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.
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.