Books Home

Passeport pour UNICODE

 

Bernard Desgraupes

288 pages

ISBN 2-7117-4827-8

Editions Vuibert Informatique Paris 2005

 

Unicode est un modèle d'encodage universel destiné à standardiser la gestion de textes pour toutes les langues de la planète et rendre possible l'échange de données textuelles dans un contexte international et multilinguistique. Il a pour vocation de servir de fondement à l'ensemble de la technologie de l'information et de mettre fin à la prolifération de standards nationaux incompatibles. C'est ainsi qu'il a déjà été adopté par la plupart des systèmes d'exploitation modernes ainsi que par un certain nombre d'autres standards informatiques tels que les langages HTML et XML sur lesquels reposent l'ensemble de la << toile >> Internet (le World Wide Web) ou encore des langages de programmation tels que Java ou C#, des langages de script tels que Python, Tcl ou Perl.

Le bénéfice d'une telle standardisation est bien évidemment une stabilité et une fiabilité accrues des systèmes et des programmes, une simplification des protocoles d'échange de données et une base cohérente sur laquelle peuvent se fonder le développement des communications et l'interopérabilité des systèmes. Cela se traduit, dans un environnement où le standard a été adopté, par un gain de temps considérable puisqu'il permet de s'affranchir de tous les filtres de transcription d'un standard à un autre et, globalement, par une réduction considérable des coûts de développement.

Le besoin d'un standard de référence s'est fait sentir depuis quelques années aussi bien dans le monde des affaires que dans l'ensemble des domaines scientifiques. Il est devenu une nécessité incontournable à la suite du développement vertigineux des échanges par voie électronique et en particulier de la connexion des réseaux par l'Internet.

Origine et principes fondateurs

Le premier objectif qu'avaient en tête les fondateurs d'Unicode était de mettre fin à la situation chaotique provoquée par la multiplication d'encodages incompatibles : celle-ci était source de conflits incessants rendant la communication quasiment impossible au sein d'un parc hétérogène de machines. Les mêmes codes représentaient des caractères totalement différents en fonction des contextes. Cette incohérence se trouvait encore accrue dans les environnements asiatiques où les mêmes valeurs que l'on trouve dans le code ASCII pouvaient constituer le second octet d'un idéogramme codé sur deux octets. Le domaine de l'impression souffrait de la même manière de cette confusion et du fait que tous les caractères et symboles étaient irrémédiablement codés au moyen de 256 valeurs.

La presse, l'édition, la recherche scientifique étaient les plus handicapées par l'absence d'un système universel et standardisé. L'explosion de l'Internet a étendu le problème au monde du commerce et de l'industrie. C'est ce qui a conduit un certain nombre d'acteurs du monde informatique à se regrouper en 1988 afin de mettre sur pied une solution et de définir un standard unifié pour la publication de données au sens le plus général du terme. Le système devait exclure toute ambiguïté, il devait être universel afin d'inclure tous les systèmes existants et rester purement textuel, autrement dit abolir toutes les solutions procédurales, codes de contrôle et séquences d'échappement, principales causes de la complexité des systèmes précédents.

Un groupe avait déjà été constitué en 1984 sous l'égide de l'Organisation Internationale de Standardisation (ISO, International Standardization Organisation) et de la Commission Électronique Internationale (IEC, International Electronical Commission) afin de travailler à l'élaboration d'un projet analogue. Ce groupe était sobrement baptisé ISO/IEC JTC1/SC2/WG2, JTC signifiant comité technique associé (Joint Technical Committee), SC2 sous-comité 2 (SubCommittee) et WG2 groupe de travail 2 (working group). Le fruit de leurs travaux est connu sous le nom de standard ISO 10646 définissant l'ensemble de caractères universel (UCS, Universal Characters Set).

Au cours de l'année 1991, le Consortium Unicode et l'Organisation Internationale de Standardisation se mirent d'accord sur le fait qu'un encodage unique était indispensable et ont pu négocier la convergence des deux standards : les deux répertoires ont été fondus en un répertoire unique en janvier 1992 et, depuis lors, les deux standards ont été entièrement coordonnés et sont maintenus en parfaite synchronisation l'un avec l'autre. Il y a donc conformité absolue du standard Unicode avec l'ISO 10646, ce qui signifie que les deux standards maintiennent le même répertoire et les mêmes codes. À cela, le standard Unicode ajoute un certain nombre de ressources essentielles telles que les listes de propriétés de caractères, les implémentations d'algorithmes de tri, de recherche, etc.

Les deux standards continuent d'évoluer mais des comités de liaison formels se chargent de la coordination et de la synchronisation des répertoires. C'est ainsi que la version 3.0 du répertoire Unicode est point pour point identique à la spécification ISO 10646-1:2000, puis que la version 3.1 ajoute tous les caractères encodés publiés par la spécification ISO 10646-2:2001. Il en va de même pour les formes d'encodage : les formes UTF-8 et UTF-16 d'Unicode se trouvent dans les annexes ISO 10646-1:2000, la forme UTF-32 correspond à la forme UCS-4 du standard ISO 10646.

Le standard Unicode est en perpétuelle évolution et des caractères et scripts nouveaux continuent d'y être ajoutés. La gestion du développement du standard et des publications associées est confiée, au sein du consortium, à un groupe de travail appelé Comité technique Unicode (UTC, Unicode Technical Committee)

Le standard ISO 10646 est toujours un peu en avance sur le standard Unicode car il adopte régulièrement de nouveaux amendements. Périodiquement, Unicode collecte les nouveaux amendements et les insère dans une nouvelle version de son standard. Le tableau suivant indique cette correspondance.
Unicode 1.0 1991 Antérieure à la fusion
Unicode 1.1 1993 Norme ISO 10646-1:1993
Unicode 2.0 1996 Norme ISO 10646-1:1993 avec amendements 1 à 7
Unicode 2.1 1998 Norme ISO 10646-1:1993 avec amendements 1 à 7 et 18
Unicode 3.0 1999 Norme ISO 10646-1:2000 constituée de ISO 10646-1:1993 avec amendements 1 à 31
Unicode 3.1 2001 Norme ISO 10646-1:2000 et 10646-2:2001
Unicode 3.2 2002 Norme ISO 10646-1:2000 avec amendement 1 et 10646-2:2001

La mesure du défi

Si les enjeux de la définition d'un standard couvrant toutes les langues de la planète sont considérables, les problèmes à résoudre ne le sont pas moins. Les langages et leurs systèmes d'écriture présentent des particularités qu'il a fallu analyser, répertorier et finalement modéliser. En voici quelques-unes qui donnent la mesure du défi relevé :

La liste n'est pas exhaustive. Il a fallu également délimiter le champ d'intervention du standard et spécifier exactement les aspects qui sont pris en compte par l'encodage et ceux qui ne le sont pas.

Un encodage standardisé

Quelques grands principes ont présidé à la constitution du standard Unicode. Nous les mentionnerons ici rapidement et y reviendrons en détail au chapitre 1 :

D'autres principes directeurs d'ordre plus technique, tels que la composition dynamique, les équivalences de séquences, etc., seront précisés ultérieurement.

Le point de départ de l'encodage Unicode a été l'encodage ASCII utilisé pour encoder les caractères de l'alphabet latin. Le standard y ajoute la capacité d'encoder presque tous les langages écrits de la planète. Chaque caractère se voit attribuer à la fois une valeur numérique unique et un nom le caractérisant de manière unique. C'est une garantie à la fois de simplicité et d'efficacité.

Dans ses premières incarnations, le standard Unicode pensait utiliser un encodage 16 bits c'est-à-dire un encodage stockant les codes sur deux octets autorisant ainsi 216 = 65 536 valeurs. Le chiffre, qui paraissait astronomique à l'époque, a depuis été dépassé : la version 4.0 du standard en comporte 96 382, alloués dans un espace qui peut en recevoir 1 114 112. Le sous-ensemble des langues asiatiques en comporte à lui seul 70 207, qui proviennent des multiples standards en vigueur en Chine, au Japon, à Taiwan, en Corée, au Vietnam et à Singapour. Il semble maintenant que ce nombre soit considéré comme amplement suffisant pour couvrir tous les scripts et systèmes d'écriture passés et présents. Nous verrons d'autre part qu'il existe trois formes d'encodage portant sur le répertoire commun (le mot << forme >> est utilisé ici en un sens très précis) ; une forme 32 bits dite UTF-32, une forme 16 bits dite UTF-16 et une forme 8 bits dite UTF-8.

Il est important de comprendre qu'Unicode ne se résume pas à cette seule collection de codes. À chaque caractère est attachée, en plus du code et du nom, une série d'informations décrivant des propriétés particulières de ce caractère telles que la casse, la direction de base, des valeurs clés permettant le tri alphabétique, etc. Des propriétés sémantiques sont aussi incluses lorsque c'est nécessaire, ainsi que des correspondances avec d'autres tables, d'autres ensembles de caractères. Toute cette information est stockée selon un format bien établi qui se trouve lui-même standardisé afin de rendre cohérente l'utilisation de ces données. En un mot, les données procurées par le standard Unicode vont bien au-delà de la simple attribution de codes. Les applications qui peuvent en tirer profit ne se limitent donc pas aux seuls programmes manipulant du texte.

Les caractères inclus dans le standard sont tous traités de la même façon, qu'il s'agisse de lettres alphabétiques, d'idéogrammes des langues asiatiques, d'agrégats consonantiques des langues du continent indien, ou encore de marques de ponctuation, de symboles relevant des mathématiques ou la physique, de certaines formes géométriques ou de symboles graphiques usuels. En revanche, aucun symbole à usage privé n'est répertorié par le standard ; il en va de même des pictogrammes ou des logos provenant de l'industrie. Les systèmes notationnels ne relevant pas directement du texte sont aussi exclus : les notations de danse ou les diagrammes de pédales des harpistes, pour citer des exemples précis, ne font pas partie du répertoire couvert par Unicode. Néanmoins, il existe des zones d'encodage réservées à l'usage privé : 6 400 valeurs du plan de base (dit BMP, Basic Multilingual Plane) sont réservées. Le standard s'engage à ne pas les utiliser afin que les applications puissent en faire usage pour leurs propres besoins. Ces valeurs sont bien sûr dépourvues du caractère universel de l'encodage. D'autres zones sont réservées à l'usage privé en dehors du plan de base, si jamais ces 6 400 valeurs ne suffisaient pas.

Enfin, le standard Unicode propose en complément des algorithmes standardisés permettant d'implémenter des fonctions de tri, de recherche et de substitution, de décomposition des caractères composites. D'autre part, des rapports techniques sont publiés et mis à jour régulièrement pour préciser des questions d'ordre technique liées à des langages particuliers. Bien que ne faisant pas à proprement parler partie de la définition du standard lui-même, il s'agit bien plus que de simples recommandations car ils fournissent une approche rationnelle et cohérente pour la résolution de problèmes particuliers.

Évolutivité et stabilité

Il est un autre aspect encore qui fait d'Unicode un outil à la fois souple et fiable : c'est sa capacité d'extension et de développement combinée à la garantie de stabilité. De nouveaux caractères sont régulièrement ajoutés, de même que de nouvelles propriétés peuvent faire leur apparition. Par exemple, les scripts suivants ont fait leur entrée dans la version 4.0 du standard : italique ancien, gothique, deseret, shavien, osmanya, linéaire B, chypriote, ougaritique, limbu, Tai Le, de même que quatre scripts philippins. De nombreux symboles phonétiques n'appartenant pas au système IPA (International Phonetic Alphabet) et quelques centaines de symboles mathématiques ont été ajoutés au répertoire. Par ailleurs, le nombre des idéogrammes encodés a plus que doublé par rapport à ce que comportait le standard précédent 3.0.

Mais en tant que standard, Unicode se doit d'évoluer de manière compatible d'une version à l'autre. Il faut ici faire la distinction entre l'encodage proprement dit en tant que système de valeurs attribuées à un répertoire de caractères et les formes adoptées pour représenter et stocker en mémoire les éléments du répertoire. Si les formes d'encodage ont pu évoluer au cours de son histoire, en revanche, les caractères encodés ont été immuables.

La politique de stabilité d'Unicode implique un certain nombre de garanties :

Scripts, encodages et textes

Le standard Unicode est effectivement une superstructure regroupant tous les caractères en usage actuellement. Il englobe tous les standards nationaux et internationaux majeurs ainsi que de nombreux ensembles de caractères définis par l'industrie informatique. On peut citer en particulier les familles d'encodage ISO 6937 et ISO 8859, le standard SGML ISO 8879, le standard bibliographique ISO 5426, les standards japonais JIS X 0208, JIS X 0212, JIS X 0213, les standards chinois GB 2312, GB 18030 et CNS 11643. On trouve de même le contenu d'encodages définis par des firmes telles que Adobe, Apple, Fujitsu, Hewlett-Packard, IBM, Lotus, Microsoft, NEC ou Xerox.

D'un autre côté, il n'est pas fait uniquement de la réunion d'encodages existants et a pu incorporer des scripts, indépendamment de tout encodage. Par script, il faut entendre toute collection cohérente de caractères en usage dans un domaine particulier. Les langues mortes ou les langues de minorités ethniques ont leur place dans l'encodage, pour peu qu'elles utilisent des caractères et des symboles qui ne sont pas déjà définis par ailleurs.

Le rôle d'Unicode est d'assurer l'encodage et le décodage transparents d'un flux textuel et de conserver aux caractères leur sémantique. Mais, de même que l'on a déjà vu que le standard ignorait délibérément la forme ou le rendu des caractères considérés en tant qu'objets graphiques ou glyphes, Unicode n'a pas davantage de notion de ce qu'est un élément textuel ni de ce qui constitue un texte. Il ne connaît en définitive que des entités appelées caractères encodés, ou plus simplement, codes. Selon les règles de composition et de décomposition, un élément textuel peut être constitué d'un nombre variable de codes. Un caractère encodé est représenté dans un fichier texte par un nombre compris entre 0 et 10FFFF en représentation hexadécimale (c'est-à-dire entre 0 et 1 114 111 en notation décimale). On peut seulement dire qu'un élément textuel est une séquence d'un ou plusieurs caractères encodés. Par exemple, un e accent aigu, que nous voyons usuellement comme un élément textuel unique, est souvent représenté comme un caractère e combiné avec un caractère accent aigu. En réalité, les caractères peuvent avoir des représentations multiples et l'un des objectifs du standard est de décider de la représentation qui sera considérée comme canonique lorsqu'il s'agira d'exécuter certaines opérations.

Le modèle d'encodage des caractères

Niveau Description Acronyme Signification
1 Répertoire abstrait ACR Abstract Character Repertoire
2 Ensemble encodé CCS Coded Character Set
3 Forme d'encodage CEF Character Encoding Form
4 Schéma d'encodage CES Character Encoding Scheme
5 Syntaxe de transfert TES Transfer Encoding Syntax

Il est important de bien faire la distinction entre plusieurs notions, dès lors que l'on parle d'encodage. Le rapport technique UTR 17, Le modèle d'encodage des caractères (Character Encoding Model) associé au standard décrit précisément le modèle adopté par Unicode pour appréhender les divers aspects de la question. On distingue cinq niveaux :

  1. Le premier niveau introduit la notion de répertoire abstrait de caractères. C'est l'ensemble des caractères que l'on souhaite encoder. Il s'agit donc d'une collection non ordonnée de symboles, comme par exemple, les lettres de l'alphabet syriaque, les symboles mathématiques, les katakanas japonais, etc.
  2. Le second niveau définit la notion d'ensemble encodé de caractères. C'est la constitution d'une table permettant de ranger les caractères du répertoire abstrait. Cette table peut être une liste ordonnée aussi bien qu'une grille comportant lignes et colonnes. Le principe est que chaque caractère trouve une place unique dans la table et qu'on peut le repérer de manière univoque par sa position ou ses << coordonnées >> dans cette table. On appelle espace d'encodage l'ensemble des positions disponibles dans la table. Plutôt que position ou coordonnées, le standard Unicode préfère utiliser le terme de code-point.
  3. Le troisième niveau correspond à la notion de forme d'encodage. C'est à ce niveau que se pose la question de la manière dont les codes-points seront représentés en mémoire. Selon les types de valeurs choisis comme codes-points, on peut être amené à des solutions différentes : les unités de stockage peuvent être l'octet, le double octet (16 bits), le quadruple octet (32 bits). L'unité choisie s'appelle unité de code. Il ne faut pas la confondre avec la taille utilisée par un code-point particulier : l'unité de code est la taille des unités de stockage et un code-point peut en utiliser plusieurs. Logiquement, plus l'unité choisie est petite, et plus il en faudra pour stocker un même code-point.
  4. Le quatrième niveau va plus loin en spécifiant l'ordre des octets lorsque l'unité de code choisie en comporte plusieurs (des octets doubles ou quadruples par exemple). C'est la notion de schéma d'encodage. Certains systèmes ont pour convention de stocker des octets multiples en allant de l'octet le plus fort à l'octet le plus faible. D'autres font l'inverse. L'enjeu est donc ici le stockage des données et leur transmission d'un système à l'autre, aussi appelé sérialisation des données.
  5. Le cinquième niveau définit la notion de syntaxe de transfert d'encodage. Il traite des questions de transmission et de transformation des données. Les syntaxes de transfert servent, d'une part, à traiter les valeurs qui peuvent être problématiques lors de leur traitement par des protocoles de transmission ou de stockage particuliers (base64, uuencode, BinHex, quoted-printable), et, d'autre part, à comprimer les données.

Cette approche en fonction de cinq niveaux est beaucoup plus pertinente et efficace que le modèle à trois niveaux proposé il y a quelques années par le Internet Architecture Board (IAB).

Comment lire cet ouvrage

L'apprentissage du standard Unicode ne présente aucune difficulté : il passe principalement par la maîtrise des notions fondamentales et de la terminologie précise qui leur est associée, de l'architecture du répertoire de caractères et des très nombreuses propriétés de caractères qu'il définit, et enfin des règles régissant les formes d'encodage et les algorithmes de normalisation (composition et décomposition).

Le chapitre 1, L'architecture du standard, définit les grands principes qui ont présidé à l'élaboration du standard Unicode et introduit toutes les notions de base. Ensuite, selon ses besoins, le lecteur pourra lire les chapitres qui suivent dans un ordre quelconque : le chapitre 2, Propriétés des caractères, décrit l'organisation et l'utilisation de la base de données Unicode, le chapitre 3, Formes et schémas, explique comment calculer effectivement les valeurs représentant les codes-points dans les différentes formes (UTF-8, UTF-16, UTF-32). Le chapitre 4, Clauses de conformité et définitions, intéressera les programmeurs qui souhaitent supporter le standard dans une application car il donne les clauses rigoureuses à respecter pour aboutir à une implémentation conforme. Le chapitre 5, Composition et décomposition, aborde les questions de normalisation des données Unicode, c'est-à-dire de leur mise sous une forme canonique afin de permettre les opérations de comparaison, de recherche et de tri. Le chapitre 6, Les algorithmes, décrit les grands algorithmes qui accompagnent le standard, tels que l'algorithme bidirectionnel qui donne les règles permettant de gérer un texte mélangeant des langues qui ne s'écrivent pas dans la même direction, ou l'algorithme de tri standard.

On trouvera à la fin de l'ouvrage quelques annexes contenant des informations pratiques et des tables récapitulatives : annexe A, Les blocs Unicode, annexe B, Les alias de propriétés, annexe C, Codes officiels des systèmes d’écriture, annexe D, Rapports techniques Unicode, annexe E, Notes techniques Unicode. L'annexe H, Historique du standard, retrace les grandes étapes parcourues par le standard Unicode depuis sa première édition. L'annexe I, Unicode sur l'Internet, donne les principales adresses où l'on peut obtenir des informations officielles sur le standard et des renvois sur d'autres liens. Les annexes G, Acronymes, et F, Lexique anglais-français, permettront de mieux s'orienter à travers la terminologie anglo-saxonne et la profusion d'acronymes et de sigles employés dans les documents concernant les encodages et le traitement de textes multilingues. Enfin, une Bibliographie recense les principaux ouvrages relatifs au sujet.

Mes plus vifs remerciements s'adressent à mon collègue Benoît Habert (LIMSI - CNRS et université Paris X) qui a relu ce livre avec un soin extrême et dont les remarques et les conseils m'ont été très précieux.

 

Bernard Desgraupes

Paris, juillet 2004 -- janvier 2005