Unicode

Un article de Wikipédia, l'encyclopédie libre.
Logo Unicode.[1]

Unicode est un standard informatique qui permet des échanges de textes dans différentes langues, à un niveau mondial. Il est développé par le Consortium Unicode, qui vise au codage de texte écrit en donnant à tout caractère de n'importe quel système d'écriture un nom et un identifiant numérique, et ce de manière unifiée, quelle que soit la plateforme informatique ou le logiciel utilisé.

Ce standard est lié à la norme ISO/CEI 10646 qui décrit une table de caractères équivalente. La dernière version, Unicode 15.1, a été publiée en [2].

Totalement compatible avec le jeu universel de caractères (JUC) de l'ISO/CEI 10646, le standard Unicode l'étend en lui ajoutant un modèle complet de représentation et de traitement de textes, en conférant à chaque caractère un jeu de propriétés (qui peuvent être soit pour certaines, standardisées et stabilisées dans toutes les versions d'Unicode où le caractère a été encodé, soit informatives avec seulement une recommandation sur leur usage, qui peut évoluer en fonction des nouveaux besoins trouvés). Ces propriétés décrivent avec précision les relations sémantiques qui peuvent exister entre plusieurs caractères successifs d'un texte, et permettent de standardiser ou recommander des algorithmes de traitement qui préservent au maximum la sémantique des textes transformés. Unicode a pour objet de rendre un même texte utilisable à l'identique sur des systèmes informatiques totalement différents.

Le standard Unicode est constitué d'un répertoire de 149 186 caractères, couvrant plus de 150 écritures, d'un ensemble de tableaux de codes pour référence visuelle, d'une méthode de codage et de plusieurs codages de caractères standard, d'une énumération des propriétés de caractère (lettres majuscules, minuscules, APL, symboles, ponctuation, etc.) d'un ensemble de fichiers de référence des données informatiques, et d'un certain nombre d'éléments liés, tels que des règles de normalisation, de décomposition, de tri, de rendu et d'ordre d'affichage bidirectionnel (pour l'affichage correct de texte contenant à la fois des caractères d'écritures de droite à gauche, comme l'arabe et l'hébreu, et de gauche à droite).

En pratique, Unicode reprend intégralement la norme ISO/CEI 10646, puisque cette dernière ne standardise que les caractères individuels en leur assignant un nom et un numéro normatif (appelé point de code) et une description informative très limitée, mais aucun traitement ni aucune spécification ou recommandation pour leur emploi dans l'écriture de langues réelles, ce que seul le standard Unicode définit précisément. L'ISO/CEI 10646 fait normativement référence à certaines parties du standard Unicode (notamment l'algorithme bidirectionnel et les propriétés des caractères (en)) ; Unicode est également une norme de facto pour le traitement du texte et sert de base à de nombreuses autres normes.

But[modifier | modifier le code]

Unicode, dont la première publication remonte à , a été développé dans le but de remplacer l'utilisation de pages de code nationales.

Ces pages de code avaient dans le passé quelques problèmes. Par exemple, sur les terminaux 3270 fonctionnant en EBCDIC : lorsqu'une note de service électronique comportait un caractère « signe monétaire », le même texte plafonnant une dépense en dollars pour le lecteur américain faisait afficher sur un écran britannique le même montant en livres sterling, puisque le signe monétaire était différent dans chacun des deux pays.

Dans la pratique, tous les systèmes d'écriture ne sont pas encore présents, car un travail de recherche documentaire auprès de spécialistes peut encore s'avérer nécessaire pour des caractères rares ou des systèmes d'écriture peu connus (parce que disparus, par exemple).

Cependant, les écritures les plus utilisées dans le monde sont représentées, ainsi que des règles sur la sémantique des caractères, leurs compositions et la manière de combiner ces différents systèmes. — Par exemple, comment insérer un système d'écriture de droite à gauche dans un système d'écriture de gauche à droite (texte bidirectionnel).

Standardisation[modifier | modifier le code]

Interopérabilité[modifier | modifier le code]

Sous sa forme UTF-8, l'Unicode offre une certaine interopérabilité avec le code ASCII : en effet, les 128 caractères ASCII, y compris les caractères de contrôle, sont représentés de manière identique (sur un octet) en UTF-8 par les points de code U+0000 à U+007F.

Conformité[modifier | modifier le code]

Le standard Unicode définit des exigences permettant d'évaluer la conformité de l'implémentation d'un processus (ou d'un logiciel) à Unicode[3][source insuffisante]. Ces exigences concernent notamment (dans la version 4.0) :

  • le traitement de Points de Code non assignés ;
  • l'interprétation des séquences de caractères équivalentes ;
  • ce qu'est une modification d'interprétation du texte ;
  • le codage des caractères ;
  • l'affichage du texte bidirectionnel ;
  • la normalisation ;
  • les algorithmes ;
  • la casse.

Ces exigences permettent le support d'un sous-ensemble d'Unicode.

Alors que l'ISO/CEI 10646 définit le même jeu de caractères qu'Unicode, la différence entre ISO/CEI 10646 et Unicode tient essentiellement dans le surplus d'exigence de conformité fourni par Unicode.

Limitations[modifier | modifier le code]

Unicode est en 2016[4] le standard leader pour le codage informatique des caractères. Il sert à l'interopérabilité de logiciels, et permet par exemple de copier des textes utilisant des caractères de différents alphabets entre des logiciels différents, même n'ayant pas été spécifiquement conçus pour eux (par exemple un programme en caractères APL dans un texte LibreOffice ou dans un courriel sous Gmail). Tous les textes Unicode ne sont cependant pas codés de la même manière. Suivant la normalisation Unicode adoptée, un même signe graphique peut parfois être codé de différentes manières. Certains textes utilisent la convention NFC, d'autres la convention NFDetc. Et le standard n'interdit pas de mélanger plusieurs conventions dans un même texte. Il en va de même des logiciels.

Cette coexistence de plusieurs façons d'écrire la même chose a été exploitée par les pirates dans les années 2000 en leur permettant de déjouer des filtres : les pirates contournaient les interdictions de certaines chaînes de caractères jugées dangereuses tout simplement en les codant sous une autre forme, plus inhabituelle et de ce fait parfois non filtrée.[réf. nécessaire]

Unicode répond à ces limitations en apportant la notion d'équivalence canonique.

Normes et versions[modifier | modifier le code]

Le travail sur Unicode est parallèle et synchronisé avec celui sur la norme ISO/CEI 10646 dont les buts sont les mêmes. L'ISO/CEI 10646, une norme internationale publiée en français et en anglais, qui ne précise ni les règles de composition de caractères, ni les propriétés sémantiques des caractères.

Unicode aborde cependant la problématique de la casse, du classement alphabétique, et de la combinaison d'accents et de caractères. Depuis la version 1.1 d'Unicode et dans toutes les versions suivantes, les caractères ont les mêmes identifiants que ceux de la norme ISO/CEI 10646 : les répertoires sont maintenus parallèlement, à l'identique lors de leur standardisation définitive, les deux normes étant mises à jour presque simultanément. Les deux normes Unicode (depuis la version 1.1) et ISO/CEI 10646 assurent une compatibilité ascendante totale : tout texte conforme à une version antérieure doit rester conforme dans les versions ultérieures.

Ainsi les caractères de la version 3.0 d'Unicode sont ceux de la norme ISO/CEI 10646:2000. La version 3.2 d'Unicode classait 95 221 caractères, symboles et directives.

La version 4.1 d'Unicode, mise à jour en , comprenait :

  • 137 468 caractères à usage privé, dont 6 400 dans le plan multilingue de base (définis dans toutes les versions d'Unicode) et 131 068 supplémentaires dans les deux derniers plans (depuis la version 2.0 d'Unicode), ce qui doit suffire à tous les usages ;
  • plus de 97 755 lettres ou syllabes, chiffres ou nombres, symboles divers, signes diacritiques et signes de ponctuation, avec parmi eux :
    • plus de 70 207 caractères idéographiques (pour l'écriture classique ou modernisée des langues chinoises, et utilisés en partie et en association avec d'autres écritures plus simples en japonais, en coréen classique, ainsi qu'en vietnamien classique) ;
    • 11 172 syllabes précomposées de l'alphabet hangûl (pour la langue coréenne moderne) ;
  • plusieurs centaines de caractères de contrôle ou modificateurs spéciaux ; ainsi que
  • 8 258 points de codes réservés de façon permanente, interdits pour le codage de texte (assignés dans toutes les versions d'Unicode).

Soit un total de près de 245 000 points de codes assignés dans un espace pouvant contenir 1 114 112 codes différents.

Quelques problèmes semblent cependant exister, pour le codage des caractères chinois, à cause de l'unification des jeux idéographiques utilisés dans différentes langues, avec une calligraphie légèrement différente et parfois signifiante, mais ils sont en cours de résolution par Unicode qui a défini des sélecteurs de variantes et ouvert un registre de séquences normalisées qui les utilise.

Version Date de publication Nombre de caractères Ajouts notables
1.0.0 7129 Unicode 1.0 incluait ces scripts: Arabe, arménien, bengali, bopomofo, cyrillique, devanagari, géorgien, grec et copte, gujarati, gurmukhi, hangul, hébreu, hiragana, kannada, katakana, lao, latin, malayalam, oriya, tamoul, télougou, thaï et tibétain
1.0.1 28327 20 902 caractères CJC sont définis
1.1 34168 4306 syllabes Hangul supplémentaires ont été ajoutées à l'ensemble original de 2350. Le tibétain a été supprimé dans cette mise à jour.
2.0 38885 Le Hangul original est supprimé et est déplacé et remplacé par un nouvel ensemble de 11172. Le tibétain est rajouté à un endroit différent.
2.1 38887 Le signe Euro et le caractère de remplacement d'objet ont été ajoutés.
3.0 49194 Cherokee, éthiopien, khmer, mongol, birman, ogham, runique, cinghalais, syriaque, thaana, syllabes autochtones canadiennes unifiées et syllabes yi ajoutées, ainsi qu'un ensemble de motifs braille.
3.1 94140 Deseret, gothique et vieil italique ajoutés, ainsi que des ensembles de symboles pour la musique occidentale et la musique byzantine, et 42 711 idéogrammes unifiés CJC supplémentaires
3.2 95156 Buhid, Hanunó'o, Tagalog et Tagbanwa ajoutés
4.0 96382 Syllabaire chypriote, Limbu, Linéaire B, Osmanya, Shavian, Tai Le et Ugaritic ajoutés, ainsi que des symboles Hexagram
4.1 97655 Buginese, Glagolitic, Kharoshthi, New Tai Lue, vieux persan, Syloti Nagri et Tifinagh ont été ajoutés, et le copte a été désunifié du grec. Des chiffres grecs anciens et des symboles musicaux ont également été ajoutés.
5.0 99024 Balinais, cunéiforme, N'Ko, Phags-pa et phénicien ajoutés.
5.1 100648 Carian, Cham, Kayah Li, Lepcha, Lycian, Lydian, Ol Chiki, Rejang, Saurashtra, Sundanais et Vai ont été ajoutés, ainsi que des ensembles de symboles pour le disque Phaistos, les tuiles Mahjong et les tuiles Domino. Il y avait aussi des ajouts importants pour le birman, des ajouts de lettres et d'abréviations Scribal utilisées dans les manuscrits médiévaux, et l'ajout de Capital ẞ.
5.2 107296 Avestan, Bamum, hiéroglyphes égyptiens (l'ensemble Gardiner, comprenant 1071 caractères), araméen impérial, inscriptional pahlavi, inscriptional parthe, javanais, kaithi, lisu, meetei mayek, vieux sud-arabe, vieux turc, samaritain, tai tham et tai viet ajoutés. 4 149 idéogrammes unifiés CJK supplémentaires (CJK-C), ainsi qu'un Jamo étendu pour le vieux Hangul et des caractères pour le sanskrit védique.
6.0 109384 Batak, Brahmi, Mandaic, symboles de cartes à jouer, symboles de transport et de carte, symboles alchimiques, émoticônes et emojis. 222 idéogrammes unifiés CJC supplémentaires (CJK-D) ajoutés.
6.1 110116 Chakma, cursive méroïtique, hiéroglyphes méroïtiques, Miao, Sharada, Sora Sompeng et Takri.
6.2 janvier 2012 110117 Le signe de la lire turque a été ajouté.
6.3 septembre 2013 110122 5 caractères de formatage bidirectionnel ont été ajoutés
7.0 112956 Bassa Vah, Albanais du Caucase, Duployan, Elbasan, Grantha, Khojki, Khudawadi, Linéaire A, Mahajani, Manichéen, Mende Kikakui, Modi, Mro, Nabatéen, Vieil Arabe du Nord, Vieux Permien, Pahawh Hmong, Palmyrène, Pau Cin Hau, Psautier Pahlavi, Siddham, Tirhuta, Warang Citi et Dingbats.
8.0 120672 Ahom, hiéroglyphes anatoliens, Hatran, Multani, vieux hongrois, SignWriting, 5 771 idéogrammes unifiés CJK, un ensemble de lettres minuscules pour Cherokee et cinq modificateurs de teint emoji.
9.0 128172 Adlam, Bhaiksuki, Marchen, Newa, Osage, Tangut et 72 emoji.
10.0 136690 Place Zanabazar, Soyombo, Masaram Gondi, Nüshu, hentaigana (hiragana non standard), 7 494 idéogrammes unifiés CJC, 56 emoji et symbole bitcoin.
11.0 137374 Dogra, lettres majuscules géorgiennes Mtavruli, Gunjala Gondi, Hanifi Rohingya, nombres indiens Siyaq, Makasar, Medefaidrin, anciens sogdien et sogdien, chiffres mayas, 5 idéogrammes unifiés CJK urgents, symboles pour xiangqi (échecs chinois) et classement par étoiles, et 145 emoji.
12.0 137928 Elymaïque, Nandinagari, Nyiakeng Puachue Hmong, Wancho, ajouts d'écritures Miao pour plusieurs langues Miao et Yi de Chine, lettres minuscules hiragana et katakana pour l'écriture du japonais archaïque, fractions et symboles historiques tamouls, lettres lao pour le pali, lettres latines pour la translittération égyptologique et ougaritique, commandes de format hiéroglyphe et 61 emoji.
12.1 mai 2019 137929 Le caractère ㋿, a été ajouté en tant que forme de ligature carrée de l'ère Reiwa
13.0 143859 Khoresmien, Dives Akuru, petite écriture khitane, yezidi, 4 969 idéogrammes unifiés CJK ajoutés (dont 4 939 dans Ext. G), ajouts d'écriture arabe utilisés pour écrire le haoussa, le wolof et d'autres langues en Afrique et autres ajouts utilisés pour écrire l'hindko et le pendjabi en Pakistan, ajouts Bopomofo utilisés pour le cantonais, symboles de licence Creative Commons, caractères graphiques pour la compatibilité avec le télétexte et les systèmes informatiques domestiques des années 1970 et 1980, et 55 emoji.
14.0 144697 Toto, Cypro-Minoen, Vithkuqi, vieil ouïghour, Tangsa, ajouts d'écritures latines aux blocs SMP (Ext-F, Ext-G) pour une utilisation dans l'API étendue, ajouts d'écritures arabes pour une utilisation dans les langues à travers l'Afrique et en Iran, Pakistan, Malaisie, Indonésie, Java et Bosnie, et pour écrire des titres honorifiques, des ajouts à usage coranique, d'autres ajouts pour prendre en charge les langues en Amérique du Nord, aux Philippines, en Inde et en Mongolie, l'ajout du symbole monétaire kirghize som, prise en charge de la notation musicale Znamenny, et 37 émojis.
15.0 149186 Kawi et Mundari, plusieurs nouveaux caractères, dont 20 emojis, 4 192 idéogrammes CJC et des caractères de contrôle pour les hiéroglyphes égyptiens.
15.1 12 septembre 2023 149813 622 caractères CJK unifiés, 5 caractères de description idéographique et nouveaux emojis.

Couches d'Unicode[modifier | modifier le code]

Unicode est défini suivant un modèle en couches (Note technique Unicode no 17[5]). Les autres normes ne faisaient typiquement pas de distinction entre le jeu de caractères et la représentation physique. Les couches sont ici présentées en partant de la plus haute (la plus éloignée de la machine).

Répertoire des caractères abstraits (abstract character repertoire)[modifier | modifier le code]

La couche la plus élevée est la définition du jeu de caractères abstraits. Par exemple, Latin-1 a un jeu de 256 caractères quand Unicode et l'ISO/CEI 10646 normalisent conjointement actuellement près de 110 000 caractères dans un répertoire commun.

En outre, Unicode et l'ISO/CEO 10646 affectent une dénomination commune et normalisée à chacun de ces caractères. La liste des caractères abstraits avec leurs noms normalisés constituent la couche commune de présentation de la norme ISO/CEI 10646 et du standard Unicode. Par exemple, le caractère Ç est nommé « lettre majuscule latine c cédille ». Cette définition est totalement identique à celle de l'ISO/CEI 10646, qui approuve toute extension du répertoire. Unicode ne reprend dans le texte de sa norme que les noms normatifs en anglais, mais la norme ISO/CEI 10646 est publiée en deux langues également normatives. Ainsi les noms en anglais et en français sont tous deux normalisés par l'ISO.

Dans les faits, toute extension du répertoire se fait aujourd'hui conjointement entre le groupe de travail responsable de l'ISO/CEI 10646 (JTC1/SC2/WG2, dont les membres votants sont uniquement des autorités de normalisation nationales des pays participants, ou leur représentant officiel), et le Comité technique Unicode UTC (dont les membres votants peuvent être n'importe quelle organisation privée ou d'intérêt public, ou même un gouvernement, qui a adhéré et paye une redevance annuelle permettant de participer à ces décisions).

Jeu de caractères codés (coded character set)[modifier | modifier le code]

La normale ISO/CEI 10646 ajoute à la table précédente un numéro associé à chaque caractère abstrait du répertoire commun, lequel est repris dans le standard Unicode. Notons bien qu'il ne s'agit pas d'une représentation en mémoire, juste d'un nombre entier, appelé point de code.

L'espace de codage de ces nombres est divisé en 17 zones de 65 536 points de code : ces zones sont appelées « plans de code ». Les plans de code sont eux-mêmes divisés en « colonnes de code » comprenant 16 points de code, qui sont (autant que possible) l'unité minimale de réservation dans le répertoire pour des groupes de caractères (assignés ou à venir) souvent utilisés conjointement dans une même écriture ou ayant des propriétés de base communes).

Chaque point de code est noté « U+ » suivi(s) de 4 à 6 chiffres en hexadécimal :

  • 4 chiffres pour le premier plan appelé plan multilingue de base (donc entre U+0000 et U+FFFF) ;
  • 5 chiffres pour les 15 plans suivants (entre U+10000 et U+FFFFF) ;
  • 6 chiffres pour le dernier plan (entre U+100000 et U+10FFFF).

Ainsi le caractère nommé « Lettre majuscule latine c cédille » (Ç) a le numéro U+00C7. Il appartient au premier plan.

En principe tous les points de code entre U+0000 et U+10FFFF sont disponibles, mais certaines plages sont perpétuellement réservées à des usages particuliers, notamment une zone d'indirection exclue afin de permettre le codage UTF-16 (cf. infra), les zones à usage privé, ainsi que quelques régions (dont les deux derniers points de code de chacun des plans de code, par exemple U+FFFE ou U+FFFF) contenant des « non-caractères » et dont l'usage est interdit dans un échange de données conforme. Les autres points de code sont soit déjà affectés à des caractères, soit réservés par l'ISO/CEI 10646 pour une normalisation future.

Zone à usage privé : l'ISO/CEI 10646 et Unicode ont assigné de nombreux points de code à des caractères valides, mais dont la sémantique est inconnue car d'usage privé (par exemple les deux derniers plans entre U+F0000 et U+10FFFF sont entièrement destinés à cet usage, hormis les deux points de code à la fin de chaque plan qui sont des non-caractères interdits dans un texte conforme).

Là encore, la standardisation du codage, c'est-à-dire l'affectation des points de codes aux caractères du répertoire commun est une décision conjointe partagée entre les normes Unicode et ISO/CEI 10646. Tous les caractères du répertoire disposent d'un point de code unique (même si pour certaines langues ou pour Unicode certains caractères sont considérés comme équivalents, avec l'un d'eux désigné comme standard et recommandé et les autres présents pour des raisons de compatibilité ascendante, par exemple avec d'anciennes normes ou avec des standards encore fréquemment utilisés).

On peut noter que si le répertoire des caractères est extensible, il est limité par la borne supérieure de l'espace de codage : U+10FFFF. La grande majorité des points de code possibles n'est encore associée à aucun caractère particulier, mais peut l'être à tout moment.

Aussi ces points de code encore libres ne sont pas considérés comme non valides, mais représentent bien des caractères abstraits (non encore spécifiés, et réservés jusqu'à nouvel ordre). Ces caractères abstraits (de même que les caractères à usage privé) complètent le jeu de caractères codés du répertoire standardisé pour former un jeu unique, dit « jeu de caractères codés universel » (Universal Coded Character Set, souvent abrégé en UCS), qui contient tous les jeux de caractères codés des répertoires de chacune des versions passées, présentes et futures de l'ISO/CEI 10646 et ceux d'Unicode (depuis la version 1.1 uniquement).

Formalisme de codage des caractères (character encoding form)[modifier | modifier le code]

La couche suivante spécifie une représentation physique (en mémoire, sur disque…) de chacun des caractères abstraits : quelle unité de codage (code units), ou codet, va représenter un caractère ou plus exactement un point de code : octet, seizet (en) (mot de 16 bits) ou trente-deuzet (en) (mot de 32 bits).

Il peut exister (et il existe) plusieurs de ces formalismes. Un formalisme particulier doit préciser la taille de l'unité de codage et indiquer de quelle façon le nombre entier représentant un point de code est représenté en une suite d'unités de codage − et inversement, c'est-à-dire comment retrouver le point de code étant donné une suite d'unités de codage.

Mécanisme de sérialisation des caractères (character encoding scheme)[modifier | modifier le code]

Cette couche s'occupe de sérialiser les suites d'unités de codage définies par la couche précédente en suites d'octets. C'est ici que se choisit l'ordre des octets entre les ordres gros-boutien (octet le plus significatif d'abord) et petit-boutien (octet le moins significatif d'abord).

C'est également à cette étape qu'il est possible d'ajouter un indicateur d'ordre des octets (ou BOM, pour


We need Your Support. Make a Donation now! or