Unicode n'a pas été conçu pour contourner le problème des nombreux codages.
Unicode a été conçu pour contourner toute la question d'un nombre représentant différentes choses en fonction de la page de code utilisée. Les chiffres 0 à 127 représentent les mêmes caractères dans toutes les pages de codes Ansi. C'est ce que l'on appelle également le graphique ASCII ou le jeu de caractères. Dans les pages de code Ansi, qui autorisent 256 caractères, les chiffres 128 à 255 représentent différents caractères dans différentes pages de code.
Par exemple
- Le nombre $ 57 représente un W majuscule dans toutes les pages de code, mais
- Le numéro $ EC représente le symbole d'inifinité dans la page de code 437 (US), mais une "LETTRE LATINE LATINE N CEDILLA" dans la page de code 775 (Baltique).
- Le Cent Sign porte le numéro $ 9B dans la page de code 437, mais le numéro 96 dans la page de code 775.
Ce que Unicode a fait, c’est tout chamboulé. En Unicode, il n'y a pas de "réutilisation". Chaque numéro représente un seul caractère unique. Le nombre $ 00A2 en Unicode est le signe cent et le signe cent n'apparaît nulle part ailleurs dans la définition Unicode.
Pourquoi existe-t-il tant d'encodages Unicode? Même plusieurs versions du (essentiellement) même, comme UTF-8, UTF-16, etc.
Il n'y a pas plusieurs versions du même encodage. Il existe plusieurs codages de la même carte de définition de caractères Unicode et ceux-ci ont été "inventés" pour répondre aux besoins de stockage pour différentes utilisations des différents plans linguistiques existant dans Unicode.
Unicode définit (ou a l'espace à définir) 4.294.967.295 caractères uniques. Si vous souhaitez les mapper vers un stockage sur disque / mémoire sans effectuer de conversions algorithmiques, vous avez besoin de 4 octets par caractère. Si vous avez besoin de stocker des textes contenant des caractères de tous les plans linguaux, alors UTF-32 (qui est fondamentalement un encodage de stockage simple 1 caractère - 4 octets de la définition Unicode) est probablement ce dont vous avez besoin.
Mais rares sont les textes qui utilisent des personnages de tous les plans linguaux. Et puis utiliser 4 octets par caractère semble un gros gaspillage. Surtout lorsque vous prenez en compte le fait que la plupart des langues sur Terre sont définies dans ce que l'on appelle le plan multilingue de base (BMP): les premiers 65 536 numéros de la définition Unicode.
Et c’est là que l’UTF-16 est entré en jeu. Si vous n’utilisez que des caractères du BMP, l’UTF-16 le stockera très efficacement en utilisant seulement deux octets par caractère. Il utilisera uniquement plus d'octets pour les caractères extérieurs au BMP. La distinction entre UTF-16LE (Little Endian) et UTF-16BE (Big Endian) n’a en réalité qu’une relation avec la façon dont les nombres sont représentés dans la mémoire de l’ordinateur (la structure des octets A0
signifie hex $ A0 ou $ 0A).
Si votre texte utilise encore moins de caractères différents, comme la plupart des textes dans les langues d'Europe occidentale, vous souhaiterez limiter encore davantage les exigences de stockage de vos textes. D'où UTF-8, qui utilise un seul octet pour stocker les caractères présents dans le diagramme ASCII (les 128 premiers chiffres) et une sélection parmi les caractères Ansi (les 128 derniers numéros des différentes pages de code). Il utilisera uniquement plus d'octets pour les caractères en dehors de cet ensemble de "caractères les plus utilisés".
Donc, pour récapituler:
- Unicode est un mappage des caractères dans toutes les langues de la Terre (et certains Klingons en plus), puis de certains (mathématiques, musicaux, etc.) en un nombre unique.
- Les codages sont des algorithmes définis pour stocker des textes en utilisant les numéros de cette carte de caractères unique aussi efficacement que possible dans l'espace, étant donné "l'utilisation moyenne" des caractères dans les textes.