tuteurs.ens.fr/theorie/encodages.tml

297 lines
11 KiB
Text
Raw Normal View History

2003-01-10 16:37:24 +01:00
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Encodages</title>
</head>
<body>
<h1>L'enfer des langues</h1>
<div class="resume">
<p>
Dans cette page, nous allons voir quels probl<62>mes se posent quand on veut
taper diff<66>rentes langues avec un ordinateur, et comment on s'y prend pour
les r<>soudre de mani<6E>re plus ou moins propre.
</p>
</div>
<h2>L'<27>nonc<6E> du probl<62>me</h2>
<h3>Caract<63>res</h3>
<p>
Un texte dans une langue quelconque peut se d<>composer en une suite de
<em>caract<63>res</em>. La notion n'est pas parfaitement d<>finie, mais peu
importe en fait, en g<>n<EFBFBD>ral il n'y a pas de probl<62>me. En fran<61>ais, les
caract<EFBFBD>res sont les lettres, les chiffres, la ponctuation, les espaces. Le
O-E-dans-l'O est un caract<63>re <20> part enti<74>re, parce qu'il a une existence
propre dans l'orthographe de la langue. De m<>me, les majuscules et le
minuscules sont des caract<63>res distincts. En revanche, le gras et l'italique
ne constituent pas une distinction sur les caract<63>res.
</p>
<p>
Lorsqu'on s'adresse <20> un ordinateur pour taper du texte, ce sont
essentiellement des caract<63>res qu'on lui communique. Selon le logiciel
employ<EFBFBD>, il pourra se glisser ou pas dans cette suite de caract<63>res des
informations de mise en page. Dans le cas le plus simple, la seule mise en
forme qui intervient est le retour <20> la ligne. Dans ce cas particulier, il y
a un <20><>caract<63>re<72><65> sp<73>cial retour <20> la ligne. Ce caract<63>re existe parce
qu'il est tr<74>s utile pour les fichiers qui ne peuvent contenir que des
caract<EFBFBD>res, et aucune autre mise en forme. Il n'existe en g<>n<EFBFBD>ral pas de
caract<EFBFBD>re d<>di<64> <20> d'autres mises en forme, comme le gras et l'italique, tout
d<EFBFBD>pend du logiciel utilis<69>.
</p>
<p>
En bref, un texte est une suite de caract<63>res.
</p>
<h3>Fichiers, octets</h3>
<p>
Depuis le temps, vous savez probablement d<>j<EFBFBD> qu'un fichier sur un
ordinateur n'est ni plus ni moins qu'une suite d'<em>octets</em>, c'est <20>
dire en quelque sorte des nombres entre 0 et 255. <20> vrai dire, on pourrait
aussi bien les penser comme 256 parfums possibles pour des glaces, ou 256
couleurs possibles<65>: il y a 256 valeurs possibles, on peut les voir comme
des nombres si on veut (et dans ce cas il y a une mani<6E>re naturelle de le
faire), ou comme autre chose si on pr<70>f<EFBFBD>re.
</p>
<p>
Toute la difficult<6C> r<>side dans le fait de repr<70>senter une suite de
caract<EFBFBD>res par une suite d'octets. Nous allons voir que ce n'est pas si
simple.
</p>
<h2>Les premi<6D>res solutions</h2>
<h3>Les informaticiens sont joueurs</h3>
<p>
Une des occupations favorites des informaticiens, c'est de mettre dans leurs
programmes des limites arbitraires qui vont plus tard poser des probl<62>mes
sans fin. Une telle impr<70>voyance a d<>fray<61> la chronique il y a peu<65>: le
fameux bug de l'an 2000 (sauf que <20>a a fait un flop monumental, les
journalistes n'ayant pas compris que 2000 n'est pas du tout un nombre rond
pour un ordinateur). Le probl<62>me de la repr<70>sentation est probablement le
domaine o<> elle se fait le plus cruellement sentir, et le probl<62>me n'est pas
encore pr<70>s d'<27>tre compl<70>tement r<>solu.
</p>
<p>
Tout commence par une constatation tr<74>s simple<6C>: les premiers
informaticiens parlaient anglais. Et l'anglais s'<27>crit avec pas grand
chose<EFBFBD>: deux fois 26 lettres, 10 chiffres, une trentaine de signes de
ponctuation, de signes math<74>matiques, sans oublier le symbole dollar<61>: avec
95 caract<63>res au total on peut se d<>brouiller.
</p>
<p>
<EFBFBD> l'<27>poque dont je parle, on ne pouvait utiliser que la moiti<74> des octets,
soit 128 valeurs. On en a pris 33 comme caract<63>res de <20><>contr<74>le<6C><65> (dont
le retour <20> la ligne, plus des trucs plus exotiques, comme faire sonner la
machine, ou des codes bizarres pour d<>placer le curseur), plus les 95 dont
on avait besoin pour <20>crire l'anglais. On a num<75>rot<6F> tout <20>a, <20>a a donn<6E> le
code <abbr lang="en_US" title="American Standard Code for Information Interchange">ASCII</abbr><3E>:
une correspondance entre les octets de 0 <20> 127 avec des codes de contr<74>le et
les 95 caract<63>res utiles pour taper de l'anglais.
</p>
<p>
La solution <20>tait donc toute simple<6C>: un octet par caract<63>re, un caract<63>re
par octet, pourquoi se fatiguer<65>?
</p>
<h3>Les Europ<6F>ens veulent jouer aussi</h3>
<p>
Bien s<>r, au bout d'un moment, il y a des gens qui ont eu envie de pouvoir
taper du fran<61>ais ou de l'allemand sur leur ordinateur. Heureusement, entre
temps, il <20>tait devenu possible d'utiliser les valeurs laiss<73>es de c<>t<EFBFBD> par
l'ASCII. Dans cette place, il a <20>t<EFBFBD> possible de caser les caract<63>res
accentu<EFBFBD>s et divers autres symboles utilis<69>s par les langues d'europe de
l'ouest.
</p>
<p>
Dans le m<>me temps, les informaticiens russes ont profit<69> de ces 128
valeurs pour y caser l'alphabet cyrillique. Les Grecs y ont aussi mis leur
propre alphabet.
</p>
<p>
Dans ces 128 valeurs, il n'y a h<>las pas la place de caser les caract<63>res
pour les langues occidentales <em>et</em> l'alphabet cyrillique <em>et</em>
l'alphabet grec <em>et</em> l'alphabet h<>breu. Mais ce n'est pas grave. En
France, on tape du fran<61>ais, pas du grec<65>; en Gr<47>ce on tape du grec, pas du
Cyrillique<EFBFBD>; en Russie on tape du cyrillique, pas du fran<61>ais. Les
ordinateurs <20>taient configur<75>s pour que le clavier envoie certains codes,
que l'<27>cran affiche certains caract<63>res, et que tout marche bien comme <20>a.
Bien s<>r <20>a ne marche plus du tout si on franchit la fronti<74>re, ou si on va
chez le voisin qui a un ordinateur d'une marque diff<66>rente, mais ce n'est
pas grave.
</p>
<h3>Les encodages</h3>
<p>
Non, bien s<>r, tout ceci ne pouvait pas durer. Pour le probl<62>me de pouvoir
taper plusieurs langues sur un m<>me ordinateur, la solution est simple<6C>: il
suffit d'<27>tiqueter chaque fichier, celui-ci est en fran<61>ais, celui-ci en
grec.
</p>
<p>
Mais il fallait aussi que les ordinateurs puissent communiquer entre eux
m<EFBFBD>me en <20>tant de marques diff<66>rentes. Donc au lieu que chaque fabricant
invente sa propre correspondance entre octets et caract<63>res, des organismes
de standardisation s'y sont mis. <20>a a donn<6E> des tables de correspondance,
comme l'ISO-8859-1, qui propose un jeu de caract<63>res pour les langues
occidentales, l'ISO-8859-5 qui offre du cyrillique, l'ISO-8859-7, qui
propose du grec, etc.
</p>
<p>
Tous les probl<62>mes n'<27>taient pas r<>solus, mais au moins il suffit d'indiquer
au d<>but d'un texte le nom de l'encodage qu'il utilise, et pour peu qu'on
ait les bonnes polices de caract<63>res, on peut le lire sans probl<62>me.
</p>
<h3>Et les langues orientales dans tout <20>a<EFBFBD>?</h3>
<p>
Bon, tout <20>a c'est tr<74>s bien, mais m<>me en tassant tr<74>s fort, on n'arrivera
pas <20> faire rentrer les 1945 id<69>ogrammes du japonais officiel dans un octet.
Ni les 11&thsp;172 syllables cor<6F>ennes, ni les dizaines de milliers
d'id<69>ogrammes chinois qu'on arrive <20> recenser.
</p>
<p>
Les informaticiens orientaux ont donc d<> inventer leurs propres m<>thodes,
des codages qui abandonnaient la correspondance un octet = un caract<63>re.
Bien s<>r, si vous croyez que les informaticiens japonais ont fait un code
qui permet de faire aussi du chinois, ou le contraire, vous <20>tes un
ind<EFBFBD>crotable id<69>aliste qui n'a rien compris <20> l'informatique.
</p>
<h3><3E>tat des lieux</h3>
<p>
Tout ceci nous am<61>ne presque <20> l'<27>tat actuel de l'informatique<75>:
</p>
<ul>
<li>Pour les langues <20><>simples<65><73>, un codage standard avec un octet par
caract<63>re est utilis<69>.</li>
<li>Les textes sont <20>ventuellement <20>tiquet<65>s par l'encodage qu'ils
utilisent.</li>
<li>Les logiciels occidentaux sont profond<6E>ment li<6C>s <20> la correspondance un
octet = un caract<63>re.</li>
<li>Les logiciels orientaux utilisent de mani<6E>re tr<74>s fig<69>e un syst<73>me
sp<73>cifique <20> une langue.</li>
</ul>
<p>
Ce qui manque <20> tout <20>a, c'est la possibilit<69> qu'un m<>me texte (et dans
certains cas un m<>me logiciel) contienne simultan<61>ment plusieurs langues
couvertes par des encodages diff<66>rents. Militons pour le droit des
universitaires russes de faire des th<74>ses sur les traductions de la Bible de
l'h<>breu au grec<65>!
</p>
<h2>Unicode</h2>
<h3>Le but du projet</h3>
<p>
Pour r<>soudre <em>durablement</em> tous ces probl<62>mes de langues, il s'est
form<EFBFBD> un consortium, qui regroupe de grands noms de l'informatique et de la
linguistique<EFBFBD>: le consortium Unicode. Sa t<>che<68>: recenser et num<75>roter
tous les caract<63>res existant dans toutes les langues du monde. Au moment o<>
j'<27>cris ces lignes, le standard publi<6C> comporte presque 60&thsp;000
caract<EFBFBD>res.
</p>
<p>
Avec Unicode, un texte dans n'importe quelle langue, ou n'importe
quelle<em>s</em> langue<em>s</em> peut se repr<70>senter comme une suite de
nombres. Quelle simplification<6F>!
</p>
<h3>Les nouveaux codages</h3>
<p>
Il est possible d'utiliser directement Unicode pour stoquer les textes
informatiques, en utilisant plusieurs octets pour codes les caract<63>res<65>: on
appelle ce code UCS-4 parce qu'il utilise 4 octets par caract<63>res, le
consortium Unicode ayant pr<70>vu que deux milliards de caract<63>res ne seraient
pas atteints dans l'imm<6D>diat.
</p>
<p>
Il existe cependant un autre code largement utilis<69> avec Unicode. Il
s'appelle UTF-8. Il est un peu plus complexe, il utilise un nombre variable
d'octets par caract<63>res, mais pr<70>sente certains avantages<65>: il est
compatible avec l'ASCII, de sorte que les parties <20>crites avec l'alphabet
latin de base d'un texte cod<6F> en UTF-8 seront <20> peu pr<70>s lisibles m<>me avec
un logiciel qui ne comprend pas ce codage.
</p>
<h3>Comment marchent les bons logiciels</h3>
<p>
Un bon logiciel est maintenant un logiciel qui permet de travailler avec
Unicode. Enfin, l<>, je parle des logiciels qui ont <20> g<>rer du texte, hein,
un D<>mineur peut tr<74>s bien continuer <20> d<>miner sans se soucier d'Unicode.
Un bon logiciel, disais-je, va travailler autant que possible en Unicode. En
interne, ses donn<6E>es seront probablement cod<6F>es uniquement en UCS-4 ou UTF-8
selon ce qu'il en fait, mais <20>a n'a pas besoin d'<27>tre visible. L'important
est qu'il saura jongler entre les diff<66>rents encodages pour communiquer avec
d'autres composants.
</p>
<p>
Prenons l'exemple d'un logiciel de courrier <20>lectronique. Les courrier re<72>us
comportent une indication de leur codage<67>: hop, le logiciel se d<>brouille
pour en faire de l'Unicode. Il les affiche en convertissant dans le bon
codage pour le syst<73>me graphique ou le terminal dans lequel il tourne. Quand
on veut r<>pondre, il pr<70>pare la citation dans le bon encodage pour
l'<27>diteur, puis r<>cup<75>re le texte ainsi <20>dit<69> et le reconvertit. <20> l'envoi,
il va choisir le meilleur encodage, en tenant compte des n<>cessit<69>s (les
caract<EFBFBD>res utilis<69>s dans le courrier), et du fait que le destinataire n'a
pas forc<72>ment un logiciel qui comprend unicode (et donc il vaut mieux
utiliser un encodage plus ancien et simple si possible).
</p>
<p>
Tout ceci est un peu compliqu<71>, parce que le logiciel est <20> l'interface
entre le r<>seau, l'utilisateur et l'<27>diteur de texte, qui peuvent chacun
utiliser un encodage diff<66>rent. <20> terme, ce sera probablement de l'UTF-8 de
tous les c<>t<EFBFBD>s, et ce sera plus simple.
</p>
<h2>En pratique</h2>
<p>
D'ici quelques temps, nous aurons des textes d<>crivant la marche <20> suivre,
en pratique pour<75>:
</p>
<ul>
<li>taper en Unicode avec Vim ou Emacs, et dans un terminal en g<>n<EFBFBD>ral,</li>
<li>utiliser le logiciel de courrier Mutt avec Unicode,</li>
<li>taper du LaTeX en Unicode.</li>
</ul>
<div class="metainformation">
Auteur<EFBFBD>: Nicolas George. Derni<6E>re modification le 2003-01-09.
</div>
</body>
</html>