487 votes

Qu'est-ce que Unicode, UTF-8 et UTF-16?

Quelle est la base de Unicode et pourquoi le besoin d'UTF-8 ou UTF-16? J'ai fait des recherches sur Google et également recherché ici, mais ce n'est pas clair pour moi.

Dans VSS, lorsqu'on effectue une comparaison de fichiers, il arrive parfois qu'un message indique que les deux fichiers ont des UTF différents. Pourquoi serait-ce le cas?

Veuillez expliquer en termes simples.

153 votes

Il semble que vous avez besoin de lire Le strict minimum que tout développeur de logiciel doit absolument savoir sur Unicode et les jeux de caractères! C'est une très bonne explication de ce qui se passe.

0 votes

Introduction plus courte de mon blog. Elle a été obtenue à partir de l'article de Joel, mais appliquée à un problème spécifique.

5 votes

Cette FAQ du site web officiel d'Unicode a quelques réponses pour vous.

13voto

Kishu Agarwal Points 348

Unicode est une norme qui mappe les caractères de toutes les langues à une valeur numérique particulière appelée un point de code. La raison pour laquelle elle le fait est qu'elle permet à différents encodages d'être possibles en utilisant le même ensemble de points de code.

UTF-8 et UTF-16 sont deux de ces encodages. Ils prennent des points de code en entrée et les codent en utilisant une formule bien définie pour produire la chaîne encodée.

Le choix d'un encodage particulier dépend de vos besoins. Différents encodages ont différentes exigences de mémoire et en fonction des caractères avec lesquels vous allez travailler, vous devriez choisir l'encodage qui utilise le moins de séquences d'octets pour coder ces caractères.

Pour plus de détails approfondis sur Unicode, UTF-8 et UTF-16, vous pouvez consulter cet article,

Ce que tout programmeur devrait savoir sur Unicode

10voto

brighty Points 63

Pourquoi Unicode? Parce qu'ASCII n'a que 127 caractères. Ceux de 128 à 255 diffèrent dans différents pays, c'est pourquoi il existe des pages de code. Alors ils ont dit : permettons d'avoir jusqu'à 1114111 caractères.

Alors comment stocker le point de code le plus élevé? Vous devrez le stocker en utilisant 21 bits, donc vous utiliserez un DWORD ayant 32 bits avec 11 bits gaspillés. Donc si vous utilisez un DWORD pour stocker un caractère Unicode, c'est la manière la plus simple, car la valeur dans votre DWORD correspond exactement au point de code.

Mais les tableaux de DWORD sont bien sûr plus grands que les tableaux de WORD et bien sûr encore plus grands que les tableaux de BYTE. C'est pourquoi il n'y a pas seulement l'UTF-32, mais aussi l'UTF-16. Mais l'UTF-16 signifie un flux de WORD, et un WORD a 16 bits, donc comment le point de code le plus élevé 1114111 peut-il tenir dans un WORD? Il ne peut pas!

Alors ils ont mis tout ce qui est supérieur à 65535 dans un DWORD qu'ils appellent un couple de substitution. Un tel couple de substitution est composé de deux WORDS et peut être détecté en regardant les 6 premiers bits.

Et l'UTF-8? C'est un tableau de bytes ou un flux de bytes, mais comment le point de code le plus élevé 1114111 peut-il tenir dans un byte? Il ne peut pas! D'accord, ils ont donc également ajouté un DWORD, n'est-ce pas? Ou éventuellement un WORD, n'est-ce pas? Presque vrai!

Ils ont inventé les séquences utf-8, ce qui signifie que chaque point de code supérieur à 127 doit être encodé dans une séquence de 2 bytes, 3 bytes ou 4 bytes. Wow! Mais comment détecter de telles séquences? Eh bien, tout ce qui va jusqu'à 127 est de l'ASCII et est un seul byte. Ce qui commence par 110 est une séquence de deux bytes, ce qui commence par 1110 est une séquence de trois bytes et ce qui commence par 11110 est une séquence de quatre bytes. Les bits restants de ces prétendus "bytes de départ" appartiennent au point de code.

Maintenant, selon la séquence, des bytes suivants doivent suivre. Un byte suivant commence par 10 et les bits restants sont des bits utiles de charge et appartiennent au point de code. Concaténez les bits utiles du byte de départ et du/des bytes suivants et vous aurez le point de code. Voilà tout la magie de l'UTF-8.

5 votes

Utf-8 exemple du symbole € (Euro) décodé en séquence de 3 octets utf-8: E2=11100010 82=10000010 AC=10101100 Comme vous pouvez le voir, E2 commence par 1110 donc c'est une séquence de trois octets Comme vous pouvez le voir, 82 ainsi que AC commence par 10 donc ce sont des octets suivants Maintenant nous concaténons les "bits de charge utile": 0010 + 000010 + 101100 = 10000010101100 qui est le décimal 8364 Donc 8364 doit être le point de code pour le symbole € (Euro).

8voto

Siva Points 151

ASCII - Le logiciel alloue uniquement un octet de 8 bits en mémoire pour un caractère donné. Il fonctionne bien pour l'anglais et les caractères adoptés (mots empruntés comme façade) car leurs valeurs décimales correspondantes sont inférieures à 128 dans la valeur décimale. Programme d'exemple en C.

UTF-8 - Le logiciel alloue de un à quatre octets de 8 bits variables pour un caractère donné. Qu'est-ce que signifie "variable" ici? Disons que vous envoyez le caractère 'A' à travers vos pages HTML dans le navigateur (HTML est en UTF-8), la valeur décimale correspondante de A est 65, lorsqu'elle est convertie en décimale elle devient 01000010. Cela ne nécessite qu'un seul octet, et un octet de mémoire est alloué même pour les caractères anglais spéciaux adoptés comme 'ç' dans le mot façade. Cependant, lorsque vous souhaitez stocker des caractères européens, cela nécessite deux octets, vous avez donc besoin de UTF-8. Cependant, pour les caractères asiatiques, vous avez besoin d'au moins deux octets et jusqu'à quatre octets. De même, les emojis nécessitent trois à quatre octets. UTF-8 résoudra tous vos besoins.

UTF-16 allouera un minimum de 2 octets et un maximum de 4 octets par caractère, il n'allouera pas 1 ou 3 octets. Chaque caractère est représenté en 16 bits ou 32 bits.

Alors pourquoi UTF-16 existe-t-il? À l'origine, Unicode était sur 16 bits et non 8 bits. Java a adopté la version originale de UTF-16.

En fin de compte, vous n'avez pas besoin de UTF-16 sauf s'il a déjà été adopté par le langage ou la plateforme sur laquelle vous travaillez.

Un programme Java invoqué par les navigateurs web utilise UTF-16, mais le navigateur web envoie des caractères en utilisant UTF-8.

0 votes

"Vous n'avez pas besoin de UTF-16 nulle part sauf s'il a déjà été adopté par le langage ou la plateforme": C'est un bon point mais voici une liste non exhaustive: JavaScript, Java, .NET, SQL NCHAR, SQL NVARCHAR, VB4, VB5, VB6, VBA, VBScript, NTFS, Windows API….

0 votes

Re "lorsque vous voulez stocker des caractères européens, il faut deux octets, donc vous avez besoin de UTF-8" : Sauf si des pages de code sont utilisées, par exemple CP-1252.

0 votes

Re "le navigateur Web envoie des caractères en utilisant UTF-8" : À moins que quelque chose comme ISO 8859-1 soit spécifié sur une page Web(?). Par exemple,

3voto

kg11 Points 660

UTF signifie Format de Transformation Unicode. Fondamentalement, dans le monde d'aujourd'hui, il existe des scripts écrits dans des centaines d'autres langues, des formats non couverts par le basic ASCII utilisé auparavant. C'est pourquoi UTF a été créé.

UTF-8 possède des capacités de codage de caractères et son unité de code est sur huit bits tandis que pour UTF-16 elle est sur seize bits.

-1voto

MahanGM Points 1308

Une description simple que j'ai lue dans Programming Windows Charles Petzold, 5th Edition:

Tout simplement, Unicode est une extension du codage des caractères ASCII. Au lieu des 7 bits utilisés pour représenter chaque caractère dans le strict ASCII, ou des 8 bits par caractère qui sont devenus courants sur les ordinateurs, Unicode utilise un plein 16 bits pour le codage des caractères. Cela permet à Unicode de représenter toutes les lettres, idéogrammes et autres symboles utilisés dans toutes les langues écrites du monde susceptibles d'être utilisées dans la communication informatique. Unicode est destiné initialement à compléter ASCII et, avec un peu de chance, éventuellement à le remplacer. Étant donné qu'ASCII est l'une des normes les plus dominantes en informatique, c'est certainement une tâche ardue.

Section 1, Chapitre 2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X