Pourquoi avons-nous besoin d'Unicode ?
À l'époque (pas si lointaine), tout ce qui existait était ASCII. Ce n'était pas grave, car tout ce dont on avait besoin, c'était de quelques caractères de contrôle, de la ponctuation, des chiffres et des lettres comme celles de cette phrase. Malheureusement, le monde étrange de l'intercommunication mondiale et des médias sociaux d'aujourd'hui n'était pas prévu, et il n'est pas inhabituel de voir l'anglais, , , , , et dans le même document (j'espère que je n'ai pas cassé de vieux navigateurs).
Mais, à titre d'exemple, disons que Joe Average est un développeur de logiciels. Il insiste sur le fait qu'il n'aura jamais besoin que de l'anglais, et ne veut donc utiliser que l'ASCII. Cela peut convenir à Joe moyen utilisateur mais cela ne convient pas à Joe, le développeur de logiciels . Environ la moitié du monde utilise des caractères non latins et l'utilisation de l'ASCII est sans doute un manque de considération pour ces personnes. De plus, il ferme son logiciel à une économie importante et en pleine croissance.
Par conséquent, un jeu de caractères englobant comprenant todo des langues est nécessaire. C'est ainsi qu'est né Unicode. Il attribue à chaque caractère un numéro unique appelé un point de code . L'un des avantages d'Unicode par rapport à d'autres ensembles possibles est que les 256 premiers points de code sont identiques aux points de code de l'Union européenne. ISO-8859-1 et donc aussi 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 le Plan de base multilingue (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 vais me concentrer sur UTF-8 et UTF-16.
Considérations relatives à la mémoire
Ainsi, combien d'octets donnent accès à quels caractères dans ces codages ?
-
UTF-8 :
- 1 octet : ASCII standard
- 2 octets : L'arabe, l'hébreu, la plupart des écritures européennes (à l'exception notamment de l'anglais). 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 caractères qui ne figurent pas dans le BMP comprennent des écritures anciennes, des symboles mathématiques, des symboles musicaux et des caractères plus rares. Chinois/Japonais/Coréen (CJK) des personnages.
Si vous travaillez principalement avec des caractères ASCII, UTF-8 est certainement plus efficace en termes de mémoire. Toutefois, si vous travaillez principalement avec des scripts non européens, l'utilisation d'UTF-8 peut être jusqu'à 1,5 fois moins efficace en termes de mémoire qu'UTF-16. Lorsque vous traitez de grandes quantités de texte, comme des pages Web volumineuses ou de longs documents Word, cela peut avoir un impact sur les performances.
Les bases du codage
Remarque : si vous savez comment sont codés les UTF-8 et UTF-16, passez à la section suivante pour les applications pratiques.
-
UTF-8 : Pour les caractères ASCII standard (0-127), les codes UTF-8 sont identiques. Cela rend l'UTF-8 idéal si une rétrocompatibilité est requise avec le texte ASCII existant. D'autres caractères nécessitent entre 2 et 4 octets. Pour ce faire, certains bits sont réservés dans chacun de ces octets pour indiquer qu'ils font partie d'un caractère à plusieurs octets. En particulier, le premier bit de chaque octet est
1
pour ne pas entrer en conflit avec les caractères ASCII.
-
UTF-16 : Pour les caractères BMP valides, la représentation UTF-16 est simplement son point de code. Cependant, pour les caractères non BMP, l'UTF-16 introduit paires de substituts . Dans ce cas, une combinaison de deux portions de deux octets correspond à un caractère non BMP. Ces portions de deux octets proviennent de la gamme numérique BMP, mais sont garanties par la norme Unicode comme étant invalides en tant que caractères BMP. De plus, comme l'UTF-16 a deux octets comme unité de base, il est affecté par les éléments suivants endiveté . Pour compenser, une réserve marque de l'ordre des octets peut être placé au début d'un flux de données qui indique l'endianness. Ainsi, si vous lisez une entrée UTF-16, et qu'aucun endianness n'est spécifié, vous devez le vérifier.
Comme on peut le constater, UTF-8 et UTF-16 sont loin d'être compatibles l'un avec l'autre. Donc, si vous effectuez des E/S, assurez-vous de savoir quel encodage vous utilisez ! Pour plus de détails sur ces encodages, veuillez consulter la page FAQ UTF .
Considérations pratiques sur la programmation
Types de données Character et String : Comment sont-ils codés dans le langage de programmation ? S'il s'agit d'octets bruts, dès que vous essayez de sortir des caractères non ASCII, vous risquez de rencontrer quelques problèmes. En outre, même si le type de caractère est basé sur un UTF, cela ne signifie pas que les chaînes de caractères sont des UTF corrects. Elles peuvent autoriser des séquences d'octets qui sont illégales. En général, vous devrez utiliser une bibliothèque qui prend en charge UTF, telle que UNITÉ DE SOINS INTENSIFS 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.
Encodements recommandés/par défaut/dominants : Lorsque vous avez le choix de l'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, l'UTF-8 est dominant sur le web et, depuis HTML5, il est l'UTF le plus utilisé. codage recommandé . À l'inverse, les environnements .NET et Java reposent tous deux sur un type de caractère UTF-16. De manière confuse (et incorrecte), il est souvent fait référence à l'"encodage Unicode", qui fait généralement référence à l'encodage UTF dominant dans un environnement donné.
Soutien aux bibliothèques : Les bibliothèques que vous utilisez supportent un certain type d'encodage. Lequel ? Prennent-elles en charge les cas particuliers ? La nécessité étant la mère de l'invention, les bibliothèques UTF-8 prennent généralement en charge correctement les caractères de 4 octets, puisque les caractères de 1, 2 et même 3 octets sont fréquents. Cependant, toutes les bibliothèques UTF-16 ne supportent pas correctement les paires de substituts car elles sont très rares.
Compter les caractères : Il existe en combinant caractères dans Unicode. Par exemple, le point de code U+006E (n), et U+0303 (un tilde de combinaison) forme ñ, mais le point de code U+00F1 forme ñ. Ils devraient sembler identiques, mais un simple algorithme de comptage retournera 2 pour le premier exemple, 1 pour le second. Ce n'est pas nécessairement faux, mais ce n'est peut-être pas non plus le résultat souhaité.
Comparaison pour l'égalité : A, А et Α se ressemblent, mais ils sont respectivement en latin, en cyrillique et en grec. Vous avez aussi des cas comme C et Ⅽ, l'un est une lettre, l'autre un chiffre romain. En outre, nous devons également tenir compte des caractères de combinaison. Pour plus d'informations, voir Caractères dupliqués dans Unicode .
Paires de substituts : Ces questions reviennent assez souvent sur l'OS, je me contenterai donc de fournir quelques exemples de liens :
D'autres ?
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.
4 votes
@John : c'est une très belle introduction, mais ce n'est pas la source ultime : Elle saute plusieurs détails (ce qui est très bien pour une vue d'ensemble/introduction !)
0 votes
Merci @Joachim, avez-vous une meilleure source?
0 votes
@John : Malheureusement, je ne connais aucune source qui contient toutes les informations nécessaires au même endroit. Les articles Wikipedia sur Unicode/UTF-8/UTF-16 sont bien, mais ils ne mentionnent pas toutes les implications détaillées pour le développement de logiciels. J'accueillerais certainement une telle page. Mais encore une fois : pour une introduction, l'article est excellent !
6 votes
Le l'article est super, mais il comporte plusieurs erreurs et présente l'UTF-8 sous un jour quelque peu conservateur. Je suggère de lire utf8everywhere.org comme complément.
1 votes
Après avoir lu l'article, je me suis senti éclairé mais en tant que programmeur PHP, est-ce que ce passage "Lorsque j'ai découvert que l'outil populaire de développement web PHP ignore presque complètement les problèmes d'encodage des caractères, utilisant joyeusement 8 bits pour les caractères, rendant presque impossible le développement de bonnes applications web internationales, j'ai pensé, ça suffit." a un effet significatif sur mes applications?
2 votes
Jetez un coup d'œil à ce site web : utf8everywhere.org
0 votes
Un peu en retard sur ce commentaire, mais il y a un article très complet et agréable sur ce sujet par @deceze de stackoverflow ici : kunststube.net/encoding
0 votes
@Brian-Agnew - J'ai lu cet article de Joel Spolksy et j'ai découvert qu'il est PDG de Stack Overflow ! Qui aurait cru ?
0 votes
blog.hubspot.com/website/what-is-utf-8