Accueil du site > Documentation > Voyage dans la tour de Babel du net

Voyage dans la tour de Babel du net

uZine

mardi 20 août 2002, par Fil

Pas facile de faire un site en coréen ou de surfer sur le web israélien quand on n’a pas acheté le super kit linguistique ou fait installer son ordinateur à Moscou. « Ne mettez pas d’accents dans vos mails ! » se fait-on intimer dès qu’on a des correspondants à Hongkong, à Gaza ou sur Vénus...

Les accents et l’internet ? une histoire d’huile et de vinaigre.

Défrichage

Au commencement était l’ASCII [1]. Les ordinateurs devaient pouvoir se parler, ils n’avaient pas vraiment envie de déclamer l’« ΙΛΙΑΔΟΣΑ » (l’Illiade) mais plutôt de dialoguer sur le mode

220 rezo.net ESMTP Postfix
EHLO dido.nowhere.edu
250-rezo.net
250-PIPELINING
250-ETRN
250-XVERP
MAIL FROM: <jacques@nowhere.edu>
250 Ok
RCPT TO: <spip@rezo.net>
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>

Il fallait que ça circule, peu importait vraiment comment, on verrait plus tard...

Un peu plus tard, on a vu : l’ordinateur personnel est arrivé, et pour le vendre sur le marché européen, il a fallu ajouter quelques accents pour pimenter un peu la sauce. Chaque constructeur a donc dispersé un peu au hasard les caractères qu’ils n’utilisaient pas : comme tout était codé sur 8 bits, cela faisait 255 codes à remplir (255 = 28 - 1, tu vois), et les tables de « codes ASCII » (au pluriel) ont commencé à se multiplier, évidemment incompatibles entre elles.

A l’est, on inventait d’autres codages pour caser quelques idéogrammes ou passer du cyrillique. Nos amis grecs s’envoyaient des mails en greeklish (une translittération, qui attribue une lettre de la table ASCII à chaque lettre grecque), nous pestions contre le manque d’accents dans les forums, bref, tout partait à vau-l’eau.

Ces bricolages étaient parfois sympathiques, parfois franchement grotesques. Il suffit de regarder comment est composé le pur délire nommé quoted-printable, celui-là même qui pendant des années a transformé les mails en séries de =E9=E7=3C=3C illisibles, et qui continue à nous pourrir la vie, ou de voir en détail le codage des lignes Subject: des mails dès qu’ils contiennent des accents [2].

Une faute de Français

C’est un certain D., négociateur français représentant l’AFNOR (Association française de normalisation) auprès de l’ISO (Organisation internationale des standards) qui a sacrifié, en 1987, l’e-dans-l’o (œ) - tout simplement parce que ce caractère n’existait pas sur les imprimantes de son employeur Bull... Oublié des premières listes de caractères dits latins, au même titre que le ÿ majuscule, notre ami l’e-dans-l’o le paie encore, et s’il est facile sur le net de voler un oeuf, il est plus dur d’y voler un bœuf ou de se rendre à L’HAŸ-LES-ROSES.

Toute la lumière sur cette sombre histoire d’imprimante est faite par le chercheur en informatique Jacques André dans cet article (fichier au format PDF, publié sur le site GUTenberg).

Mais ce qui nous intéresse aujourd’hui - soyons positifs ! - c’est ce qui marche, ou en tout cas ce qui peut marcher.

Déchiffrage

Une foultitude de listes de caractères se disputent le marché de la comprenance informatique : évidemment incompatibles les unes avec les autres, elles tentent de caser un alphabet dans les pauvres 255 cases qu’offrent les représentations sur 8 bits.

Une page web qui parle cyrillique commencera donc par déclarer « j’utilise le jeu de caractères windows-1251 » [3], et enverra ensuite les caractères numéros 162-165-137 pour dire ляю ; évidemment, un navigateur mal-comprenant croira qu’il s’agit de caractères iso-latins et affichera àÉè [4]. Tout cela ne nous avance guère. D’ailleurs vous avez certainement du mal à lire ce texte si vous avez un navigateur mal-comprenant.

Pause téléchargement

Il y a des navigateurs corrects aujourd’hui sur le marché : Mozilla ou Chimera sur certains systèmes, Omniweb, certaines versions récentes d’Internet Explorer, etc. Il faudra aussi probablement installer des polices de caractères. Si vous n’avez pas déchiffré ci-dessus quelque chose qui évoque, en grec, ILIADOSA ou, en russe, lyayu, il est temps d’aller télécharger quelque chose de plus moderne, ou d’abandonner toute idée de faire un site en navajo...

Voici, pour vous allécher un peu, un petit échantillon

langue un peu de texte
coréen 의 본문 내용은 영문사이트를 참고하
japonais 目次抜粋
russe серверы расположенные
roumain Pot să mănânc sticlă și ea nu mă rănește
vietnamien 世 咹 水 晶
chinois 我能吞下玻璃而不伤身体
navajo yishą́ągo

l’ordi sur lequel ce texte a été édité ne connaît ni l’arabe, ni l’ourdou, ni l’hébreu, ni... [5].

Pour savoir ce que vous devriez voir ci-dessus, je vous renvoie à la page kermit95, qui contient des photos d’écran.

Codages

Ils sont nombreux, les codages qui circulent sur le réseau : rien que pour l’iso-latin, il en existe deux versions, l’une appelée iso-8859-1 (celui qui a oublié l’œ), l’autre dénommée iso-8859-15 où le symbole euro (€-€) fait son apparition aux côtés du malheureux œ. Le cyrillique, le japonais ont plusieurs versions aussi, les deux versions du chinois occupent beaucoup plus de caractères que les malheureux 255 possibles si on se cantonne à 8 bits... c’est le bazar, mais en même temps c’est le « standard du marché » : si vous faites un site en cyrillique, c’est pour être lu par des gens qui ont peut-être un vieux PC avec Mosaic 1.3, lequel ne sait peut-être lire que le codage windows-1251.

Pour servir le maximum de monde, il faut trouver un plus petit dénominateur commun, et la fragmentation des différents charsets bidouillés à droite et à gauche ne facilite pas la tâche. Faites des essais, demandez à vos correspondants de vous montrer des sites qu’ils « voient » correctement et essayez de voir comment elles sont encodées...

La voie d’unicode

Après des années de tergiversations, le petit monde des standardiseurs et régulateurs a fini par accoucher d’une norme unique appelée (bel optimisme !) unicode et qui contient tous les caractères utilisé sur la planète, et plein de cases libres pour accueillir la riche typographie martienne ou vénusienne quand SETI@Home aura débouché sur quelque découverte...

Unicode, donc, affecte un numéro à chaque lettre, qu’on peut donner avec la notation U-0000004A (U- suivi du code hexadécimal à 8 chiffres du nombre qui représente le caractère choisi, ici un point-virgule « ; »). Mais que faire de ce numéro ? Il faut, là encore, choisir un codage pour représenter les suites de caractères unicode.

La chaîne de caractères « l’ΙΛΙΑΔΟΣΑ », en unicode, se compose ainsi de la série de numéros 108, 39, 921, 923, 921, 913, 916, 927, 931, 913. Pour mettre cette série de nombres dans un fichier, il y a, comme toujours, plusieurs manières de procéder.

- Les entités HTML

Dans ce codage, on représente chaque caractère « exotique » par l’entité &#numéro ;. Notre chaîne est donc représentée par

l’&#921 ;&#923 ;&#921 ;&#913 ;&#916 ;&#927 ;&#931 ;&#913 ;

Cette représentation a l’avantage d’être totalement compatible avec le HTML existant. Au pire, si le navigateur ne connaît pas le caractère demandé, il affichera un point d’interrogation ou le numéro de l’entité. Mais elle a un gros désavantage en termes de stockage et de traitement de l’information : un article écrit en russe et stocké sous forme d’entités HTML prend beaucoup plus de place que le même article stocké dans le charset windows-1251 (chaque caractère en effet se voit représenté par 5 ou 6 octets : &, #, chiffre, chiffre, point-virgule). Et pour faire des traitements sur ce genre de choses (un moteur de recherche en texte intégral, par exemple), c’est coton !

- Le codage UTF-8

UTF-8 est un mode de représentation des chaînes unicode complet, qui, à l’encontre de tout ce qu’on a montré précédemment, ne procède pas d’infâmes « bidouillages ».

Pour savoir si votre navigateur comprend l’UTF-8, pointez-le sur cette page de tests.
Ca n’est complet sur aucun des navigateurs que j’ai testés, mais on affiche déjà pas mal de choses.

Disons-le tout de suite : UTF-8 est le mécanisme qu’il aurait fallu adopter dès le départ, en lieu et place de l’ASCII ; tous les programmes auraient été programmés avec cette représentation des chaînes de caractères, et on n’aurait pas eu à écrire des usines à gaz pleines de filtres et de convertisseurs. Les programmeurs auraient tous eu à disposition des bibliothèques de fonctions compatibles UTF-8, et tout fonctionnerait sans poser de question.

Il est toujours temps de remettre les pendules à l’heure. Chacun va s’employer à rendre ses programmes compatibles UTF-8, et bientôt le Net aura repris le chemin de Babel (... rêve ! Encore aujourd’hui, dans certaines facs américaines, et des plus prestigieuses, on ne peut pas recevoir d’emails avec des accents français : les « é » sont transformés en « i »...). Disons, de manière plus réaliste, que certains logiciels vont s’améliorer, et qu’on pourra surfer en japonais sur certains sites, ce qui n’est déjà pas si mal et tellement beau (surtout quand on ne lit pas le japonais).

- A quoi ressemble l’UTF-8 ?

Chaque caractère unicode, on l’a vu, est un nombre compris entre 0 et 2^31-1 (soit, en hexadécimal, 0x7FFFFFFF, et en représentation décimale le très parlant 2 147 483 647). Evidemment, si on n’a que peu de caractères « exotiques » à faire passer, il n’est pas très efficace de passer à chaque fois les 31 bits d’information.

Les plages de numéros sont donc découpées en strates superposées, la première plage (caractères ASCII de base) étant représentée sur un octet (7 bits, car le premier des 8 bits qui composent un octet vaut 0 pour signaler qu’on est sur le dernier octet de la série), la deuxième (caractères composés, accentués, etc.) sur 2 octets (11 bits), la troisième (caractères exotiques) sur 3 octets (16 bits), etc., la dernière (la plus vaste, tout l’empire des caractères martiens et vénusiens) occupe 6 octets (pour un total de 31 bits de données) :

caractères unicode octets
0 à 127 (U-0000007F) 0xxxxxxx
U-00000080 - U-000007FF 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Ainsi en UTF-8, pour écrire « tête », on aura la séquence d’octets

116-195-170-116-101

116 (« t ») est inférieur à 128, donc correspond à la première plage de caractères. Octet suivant : 195 est supérieur à 128, et 170 compris entre 128 et 128+63, donc on est dans la deuxième plage (« ê »). Ensuite 116, et 101 (« e »).

Remarque : le « masque » 10xxxxxx du dernier octet permet ainsi de savoir, à n’importe quel endroit de la suite de nombres qui définit la chaîne, si l’on est sur le début d’un caractère UTF-8 ou au milieu : une fonction qui analyse un flux de données UTF-8 saura donc toujours où elle en est, malgré la longueur variable des caractères : on dit que c’est un format de données auto-synchronisé.

Pour plus de détails sur le format, il y a la FAQ Unicode et UTF-8 pour Linux où l’on découvrira les petits frères d’UTF-8, en priant pour que les standards ne se multiplient pas, une fois de plus, à l’infini.

Voir en ligne : http://www.uzine.net/article1785.html

Notes

[1] American Standard Code for Information Interchange, code standard américain pour l’échange d’information.

[2] À preuve cet entête bien réel :

Subject: [zpajol] =?iso-8859-1?Q? Jos=E9_ Bov=E9__ =AB_J'ai_v=E9cu_ avec_la_ France _du_sous- so?=
=?iso-8859-1?Q?l_=BB?=

[3] En envoyant l’entête HTTP suivant :
Content-Type: text/html; charset=windows-1251
et/ou en indiquant, dans l’entête HTML du fichier, une ligne :
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

[4] Pour aller vite, les numéros indiqués et leurs correspondances dans les deux charsets iso-latin et windows-1251 sont fictifs.

[5] MacOS X, fichiers de langues chargés au maximum de ce que j’ai pu trouver, texte édité sur TextEdit et copié-collé dans le formulaire de SPIP via le navigateur Chimera.

Je ne suis pas spécialiste de ces questions : cet article tente de synthétiser ce qui est ressorti de discussions récentes sur la liste des développeurs de SPIP, spip-dev.