Qu’est-ce que Unicode, UTF-8, UTF-16?

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

Dans VSS lors d’une comparaison de fichiers, il existe parfois un message indiquant que les deux fichiers ont des UTF différents. Pourquoi serait-ce le cas?

Veuillez expliquer en termes simples.

Pourquoi avons-nous besoin d’Unicode?

Dans les premiers jours, tout ce qui existait était ASCII. C’était correct, car il suffirait de quelques caractères de contrôle, de ponctuation, de chiffres et de lettres comme ceux de cette phrase. Malheureusement, l’étrange monde de l’intercommunication mondiale et des médias sociaux n’était pas prévu, et il n’est pas rare de voir l’anglais, le العربية, le, le רִית, le ελληνικά et le ភាសាខ្មែរ dans le même document navigateurs).

Mais pour des raisons d’argument, disons que Joe Average est un développeur de logiciels. Il insiste sur le fait qu’il n’aura besoin que de l’anglais et qu’en tant que tel, il ne veut utiliser que l’ASCII. Cela pourrait convenir à l’ utilisateur Joe, mais cela ne convient pas à Joe, le développeur du logiciel . Environ la moitié du monde utilise des caractères non latins et l’utilisation de l’ASCII est sans doute négligeable pour ces personnes, et en plus de cela, il ferme son logiciel à une grande économie en pleine croissance.

Par conséquent, un jeu de caractères englobant toutes les langues est nécessaire. Ainsi vint Unicode. Il atsortingbue à chaque caractère un numéro unique appelé sharepoint code . L’un des avantages d’Unicode par rapport aux autres ensembles possibles est que les 256 premiers points de code sont identiques à ISO-8859-1 , et donc également ASCII. En outre, la grande majorité des caractères couramment utilisés ne sont représentables que par deux octets, dans une région appelée plan multilingue de base (Basic Multilingual Plane, BMP) . Maintenant, un encodage de caractères est nécessaire pour accéder à ce jeu de caractères, et comme la question le demande, je me concentrerai sur UTF-8 et UTF-16.

Considérations de mémoire

Combien d’octets donnent access à quels caractères dans ces encodages?

  • UTF-8:
    • 1 octet: ASCII standard
    • 2 octets: arabe, hébreu, la plupart des scripts européens (à l’exclusion notamment du géorgien )
    • 3 octets: BMP
    • 4 octets: tous les caractères Unicode
  • UTF-16:
    • 2 octets: BMP
    • 4 octets: tous les caractères Unicode

Il convient de mentionner maintenant que les personnages qui ne figurent pas dans le BMP comprennent des scripts anciens, des symboles mathématiques, des symboles musicaux et des caractères chinois / japonais / coréens (CJK) plus rares.

Si vous travaillez principalement avec des caractères ASCII, alors UTF-8 est certainement plus efficace en termes de mémoire. Cependant, si vous travaillez principalement avec des scripts non-européens, l’utilisation de la technologie UTF-8 pourrait représenter jusqu’à 1,5 fois moins de mémoire que l’UTF-16. Lorsque vous manipulez de grandes quantités de texte, telles que des pages Web volumineuses ou de longs documents Word, cela peut avoir un impact sur les performances.

Notions de base sur l’encodage

Remarque: Si vous savez comment UTF-8 et UTF-16 sont encodés, passez à la section suivante pour des applications pratiques.

  • UTF-8: Pour les caractères ASCII standard (0-127), les codes UTF-8 sont identiques. Cela rend UTF-8 idéal si la compatibilité ascendante est requirejse avec le texte ASCII existant. Les autres caractères nécessitent entre 2 et 4 octets. Cela se fait en réservant quelques bits dans chacun de ces octets pour indiquer qu’il fait partie d’un caractère multi-octets. En particulier, le premier bit de chaque octet est 1 pour éviter les conflits avec les caractères ASCII.
  • UTF-16: Pour les caractères BMP valides, la représentation UTF-16 est simplement son sharepoint code. Cependant, pour les caractères non-BMP, UTF-16 introduit des paires de substitution . Dans ce cas, une combinaison de deux portions de deux octets correspond à un caractère non-BMP. Ces parties à deux octets proviennent de la plage numérique BMP, mais la norme Unicode garantit qu’elles ne sont pas valides en tant que caractères BMP. De plus, UTF-16 ayant deux octets comme unité de base, elle est affectée par l’ endianness . Pour compenser, une marque d’ordre d’octets réservés peut être placée au début d’un stream de données qui indique la nature de l’endian. Ainsi, si vous lisez une entrée UTF-16 et qu’aucune endianness n’est spécifiée, vous devez vérifier cela.

Comme on peut le voir, UTF-8 et UTF-16 sont loin d’être compatibles les uns avec les autres. Donc, si vous faites des E / S, assurez-vous de savoir quel encodage vous utilisez! Pour plus de détails sur ces encodages, veuillez consulter la FAQ UTF .

Considérations de programmation pratiques

Types de données de caractères et de chaînes: comment sont-ils encodés dans le langage de programmation? Si ce sont des octets bruts, à la minute où vous essayez de générer des caractères non-ASCII, vous pouvez rencontrer quelques problèmes. De plus, même si le type de caractère est basé sur un UTF, cela ne signifie pas que les chaînes sont bien UTF. Ils peuvent autoriser des séquences d’octets illégales. En règle générale, vous devrez utiliser une bibliothèque prenant en charge UTF, telle que ICU pour C, C ++ et Java. Dans tous les cas, si vous voulez entrer / sortir quelque chose d’autre que l’encodage par défaut, vous devrez d’abord le convertir.

Encodages recommandés / par défaut / dominants: Lorsque vous choisissez le type d’UTF à utiliser, il est généralement préférable de suivre les normes recommandées pour l’environnement dans lequel vous travaillez. Par exemple, UTF-8 est dominant sur le Web et depuis HTML5 a été l’ encodage recommandé . À l’inverse, les environnements .NET et Java sont basés sur un type de caractère UTF-16. Confusément (et à tort), le «codage Unicode» fait souvent référence au codage UTF dominant dans un environnement donné.

Prise en charge de la bibliothèque: Quels sont les encodages pris en charge par les bibliothèques? Soutiennent-ils les cas en coin? Comme la nécessité est la principale invention, les bibliothèques UTF-8 prennent généralement en charge les caractères à 4 octets, car des caractères à 1, 2 et même 3 octets peuvent être fréquents. Cependant, toutes les bibliothèques UTF-16 ne supportent pas correctement les paires de substitution car elles sont très rares.

Comptage des caractères: il existe des caractères combinés dans Unicode. Par exemple, le sharepoint code U + 006E (n) et U + 0303 (un tilde de combinaison) forment ñ, mais le sharepoint code U + 00F1 forme ñ. Ils devraient être identiques, mais un simple algorithme de comptage renverra 2 pour le premier exemple, 1 pour le dernier. Ce n’est pas nécessairement faux, mais peut ne pas être le résultat souhaité non plus.

Comparer pour l’égalité: A, А et Α se ressemblent, mais ils sont respectivement latin, cyrillique et grec. Vous avez aussi des cas comme C et Ⅽ, l’un est une lettre, l’autre un chiffre romain. De plus, nous avons également les caractères de combinaison à prendre en compte. Pour plus d’informations, voir Dupliquer des caractères dans Unicode .

Paires de substitution: Celles ci apparaissent assez souvent sur SO, donc je vais juste fournir quelques exemples de liens:

  • Obtenir une longueur de chaîne
  • Supprimer les paires de substitution
  • Vérification de palindrome

Autres?:

  • Unicode
    • est un ensemble de caractères utilisés dans le monde entier
  • UTF-8
    • un encodage de caractères capable de coder tous les caractères possibles (appelés points de code) en Unicode.
    • l’unité de code est 8 bits
    • utiliser une à quatre unités de code pour encoder Unicode
    • 00100100 pour ” $ ” (un 8 bits); 11000010 10100010 pour ” ¢ ” (deux 8 bits); 11100010 10000010 10101100 pour ” ” (trois 8 bits)
  • UTF-16
    • un autre encodage de caractères
    • l’unité de code est 16 bits
    • utiliser un à deux unités de code pour encoder Unicode
    • 00000000 00100100 pour ” $ ” (un 16 bits); 11011000 01010010 11011111 01100010 pour ” 𤭢 ” (deux 16 bits)

Unicode est une norme assez complexe. N’ayez pas trop peur, mais préparez-vous à travailler! [2]

Comme une ressource crédible est toujours nécessaire, mais que le rapport officiel est massif, je suggère de lire ce qui suit:

  1. Le minimum absolu que tout développeur de logiciels doit absolument connaître sur les jeux de caractères et d’Unicode (pas d’excuses!) Une introduction de Joel Spolsky, PDG de Stack Exchange.
  2. Au BMP et au-delà! Un tutoriel par Eric Muller, directeur technique puis vice-président du consortium Unicode. (les 20 premières diapositives et vous avez terminé)

Une brève explication:

Les ordinateurs lisent les octets et les personnes lisent les caractères. Nous utilisons donc des normes de codage pour mapper les caractères en octets. ASCII était le premier standard largement utilisé, mais ne couvre que le latin (7 bits / caractère peuvent représenter 128 caractères différents). Unicode est un standard dont l’objective est de couvrir tous les caractères possibles dans le monde (pouvant contenir jusqu’à 1 114 112 caractères, soit 21 bits / caractère maximum. Unicode 8.0 actuel spécifie 120 737 caractères au total, et c’est tout).

La principale différence est qu’un caractère ASCII peut être associé à un octet (8 bits), mais la plupart des caractères Unicode ne le peuvent pas. Ainsi, les formulaires / schémas d’encodage (comme UTF-8 et UTF-16) sont utilisés et le modèle de caractères se présente comme suit:

Chaque personnage détient une position énumérée de 0 à 1 114 111 (hexadécimal: 0-10FFFF) appelée sharepoint code .
Un formulaire d’encodage mappe un sharepoint code sur une séquence d’unités de code. Une unité de code correspond à la manière dont les caractères doivent être organisés en mémoire, en unités de 8 bits, en unités de 16 bits, etc. UTF-8 utilise 1 à 4 unités de 8 bits, et UTF-16 utilise 1 ou 2 unités de 16 bits pour couvrir la totalité Unicode de 21 bits max. Les unités utilisent des préfixes pour que les limites des caractères puissent être repérées et qu’un plus grand nombre d’unités signifie plus de préfixes qui occupent des bits. Ainsi, bien que UTF-8 utilise 1 octet pour le script latin, il a besoin de 3 octets pour les scripts ultérieurs dans Basic Multilingual Plane, tandis que UTF-16 utilise 2 octets pour tous ces scripts. Et c’est leur principale différence.
Enfin, un schéma de codage (comme UTF-16BE ou UTF-16LE) mappe (sérialise) une séquence d’unités de code à une séquence d’octets.

personnage: π
sharepoint code: U + 03C0
formulaires d’encodage (unités de code):
UTF-8: CF 80
UTF-16: 03C0
schémas de codage (octets):
UTF-8: CF 80
UTF-16BE: 03 C0
UTF-16LE: C0 03

Astuce: un chiffre hexadécimal représente 4 bits, donc un nombre hexadécimal à deux chiffres représente un octet
Jetez également un coup d’oeil aux cartes de plan dans Wikipedia pour avoir une idée de la disposition de jeu de caractères

À l’origine, Unicode était destiné à avoir un codage 16 bits à largeur fixe (UCS-2). Les premiers utilisateurs d’Unicode, comme Java et Windows NT, ont construit leurs bibliothèques autour de chaînes de 16 bits.

Par la suite, la scope d’Unicode a été étendue pour inclure des caractères historiques, ce qui nécessiterait plus que les 65 536 points de code pris en charge par un codage 16 bits. Pour permettre aux caractères supplémentaires d’être représentés sur les plates-formes ayant utilisé UCS-2, le codage UTF-16 a été introduit. Il utilise des “paires de substitution” pour représenter des caractères dans les plans supplémentaires.

Pendant ce temps, beaucoup de logiciels et de protocoles réseau plus anciens utilisaient des chaînes de 8 bits. UTF-8 a été conçu pour que ces systèmes puissent prendre en charge Unicode sans avoir à utiliser de caractères larges. Il est rétrocompatible avec l’ASCII 7 bits.

Pourquoi unicode? Parce que ASCII ne contient que 127 caractères. Ceux de 128 à 255 diffèrent selon les pays, c’est pourquoi il y a des pages de codes. Donc, ils ont dit laisse jusqu’à 1114111 caractères. Alors, comment stockez-vous le sharepoint code le plus élevé? Vous devrez le stocker en utilisant 21 bits, vous utiliserez donc un DWORD de 32 bits avec 11 bits perdus. Donc, si vous utilisez un DWORD pour stocker un caractère Unicode, c’est le moyen le plus simple car la valeur de votre DWORD correspond exactement au sharepoint code. Mais les tableaux DWORD sont bien sûr plus grands que les tableaux WORD et bien sûr plus grands que les tableaux BYTE. C’est pourquoi il n’y a pas seulement utf-32, mais aussi utf-16. Mais utf-16 signifie un stream WORD, et un WORD a 16 bits, alors comment le plus grand sharepoint code 1114111 peut-il tenir dans un WORD? Ça ne peut pas! Ils ont donc mis tout ce qui est supérieur à 65535 dans un DWORD qu’ils appellent une paire de substitution. De telles paires de substitution sont deux mots et peuvent être détectées en regardant les 6 premiers bits. Alors qu’en est-il de l’utf-8? C’est un tableau d’octets ou un stream d’octets, mais comment le sharepoint code le plus élevé 1114111 peut-il tenir dans un octet? Ça ne peut pas! Ok, alors ils ont mis un DWORD à droite? Ou peut-être un mot, non? Presque juste! Ils ont inventé les séquences utf-8, ce qui signifie que chaque sharepoint code supérieur à 127 doit être codé dans une séquence de 2 octets, 3 octets ou 4 octets. Hou la la! Mais comment détecter de telles séquences? Eh bien, tout ce qui précède 127 est ASCII et est un seul octet. Ce qui commence par 110 est une séquence de deux octets, ce qui commence par 1110 est une séquence de trois octets et ce qui commence par 11110 est une séquence de quatre octets. Les bits restants de ces soi-disant “startbytes” appartiennent au sharepoint code. Maintenant, en fonction de la séquence, les octets suivants doivent suivre. Un octet suivant commence par 10, les bits restants sont 6 bits de bits de charge utile et appartiennent au sharepoint code. Concaténer les bits de charge utile de l’octet de début et de l’octet / s suivant et vous aurez le sharepoint code. C’est toute la magie de l’utf-8.

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

ÉCRIT À BUFFER

Si vous écrivez dans un tampon de 4 octets, le symbole avec l’encodage UTF8, votre binary ressemblera à ceci:

00000000 11100011 10000001 10000010

Si vous écrivez dans un tampon de 4 octets, le symbole avec l’encodage UTF16, votre binary ressemblera à ceci:

00000000 00000000 00110000 01000010

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

Par exemple, pour ce symbole particulier: ing Le codage UTF16 est plus efficace car nous avons 2 octets de réserve à utiliser pour le symbole suivant. Mais cela ne signifie pas que vous devez utiliser UTF16 pour l’alphabet japonais.

LECTURE DE 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 not

Remarque: l’ encodage et l’Unicode sont deux choses différentes. Unicode est le grand (tableau) avec chaque symbole associé à un sharepoint code unique. par exemple, le symbole (lettre) a un (sharepoint code) : 30 42 (hex). En revanche, l’encodage 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. 

entrer la description de l'image ici

Unicode est une norme qui associe les caractères de toutes les langues à une valeur numérique particulière appelée Points de code . La raison en est que cela permet différents codages en utilisant le même ensemble de points de code.

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

Le choix d’un encodage particulier dépend de vos besoins. Différents encodages ont des besoins en mémoire différents et, selon les caractères que vous utiliserez, vous devez choisir le codage qui utilise le moins de séquences d’octets pour encoder ces caractères.

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

Ce que chaque programmeur devrait savoir sur Unicode

UTF est l’abréviation de Unicode Transformation Format. Dans le monde actuel, il existe des scripts écrits dans des centaines d’autres langages, des formats non couverts par l’ASCII de base utilisé précédemment. Ainsi, UTF a vu le jour.

UTF-8 a des capacités de codage de caractères et son unité de code est de 8 bits alors que pour UTF-16, elle est de 16 bits.