tuteurs.ens.fr/www/theorie/encodages.html

399 lines
16 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Encodages</title>
<link rel="stylesheet" href="../tuteurs.css" type="text/css" />
</head>
<body>
<div class="navigation">
<h1>Tuteurs informatique<br /><a href="../meta/contact.html">Nous contacter</a></h1>
<hr />
<ul class="menu">
<li>
<a href="../meta/charte_graphique.html">Utiliser ce site</a>
</li>
<li>
<a href="../actualite.html">Actu et stages</a>
</li>
<li>
<a href="../docs/">Docs à imprimer</a>
</li>
<li>
<a href="../meta/plan_site.html">Plan du site</a>
</li>
<li>
<a href="../search.html">Rechercher</a>
</li>
</ul>
<hr />
<ul class="arbre">
<li>
<a href="../">Les tuteurs</a>
<ul class="arbre">
<li>
<a href="./">Théorie</a>
<ul class="arbre">
<li>
<a href="encodages.html" class="actuel">Encodages</a>
</li>
<li>
<a href="formats.html">Formats</a>
</li>
<li>
<a href="internet.html">Internet</a>
</li>
<li>
<a href="jargon.html">Glossaire</a>
</li>
<li>
<a href="reseaux.html">Réseaux</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr />
<ul class="menu">
<li>
<a href="http://www.eleves.ens.fr/">Serveur des élèves</a>
</li>
<li>
<a href="http://www.ens.fr/">ENS</a>
</li>
<li>
<a href="http://www.spi.ens.fr/">SPI</a>
</li>
</ul>
</div>
<div class="corps">
<h1>L'enfer des langues</h1>
<div class="sommaire">
<ul>
<li>
<a href="#s1">L'énoncé du problème</a>
<ul>
<li>
<a href="#s1_1">Caractères</a>
</li>
<li>
<a href="#s1_2">Fichiers, octets</a>
</li>
</ul>
</li>
<li>
<a href="#s2">Les premières solutions</a>
<ul>
<li>
<a href="#s2_1">Les informaticiens sont joueurs</a>
</li>
<li>
<a href="#s2_2">Les Européens veulent jouer aussi</a>
</li>
<li>
<a href="#s2_3">Les encodages</a>
</li>
<li>
<a href="#s2_4">Et les langues orientales dans tout ça ?</a>
</li>
<li>
<a href="#s2_5">État des lieux</a>
</li>
</ul>
</li>
<li>
<a href="#unicode">Unicode</a>
<ul>
<li>
<a href="#s3_1">Le but du projet</a>
</li>
<li>
<a href="#s3_2">Les nouveaux codages</a>
</li>
<li>
<a href="#s3_3">Comment marchent les bons logiciels</a>
</li>
</ul>
</li>
<li>
<a href="#s4">En pratique</a>
</li>
</ul>
</div>
<div class="resume">
<p>
Dans cette page, nous allons voir quels problèmes se posent quand on veut
taper différentes langues avec un ordinateur, et comment on s'y prend pour
les résoudre de manière plus ou moins propre.
</p>
</div>
<h2>
<a name="s1" id="s1">L'énoncé du problème</a>
</h2>
<h3>
<a name="s1_1" id="s1_1">Caractères</a>
</h3>
<p>
Un texte dans une langue quelconque peut se décomposer en une suite de
<em>caractères</em>. La notion n'est pas parfaitement définie, mais peu
importe en fait, en général il n'y a pas de problème. En français, les
caractères sont les lettres, les chiffres, la ponctuation, les espaces. Le
O-E-dans-l'O est un caractère à part entiè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ères distincts. En revanche, le gras et l'italique
ne constituent pas une distinction sur les caractères.
</p>
<p>
Lorsqu'on s'adresse à un ordinateur pour taper du texte, ce sont
essentiellement des caractères qu'on lui communique. Selon le logiciel
employé, il pourra se glisser ou pas dans cette suite de caractères des
informations de mise en page. Dans le cas le plus simple, la seule mise en
forme qui intervient est le retour à la ligne. Dans ce cas particulier, il y
a un « caractère » spécial retour à la ligne. Ce caractère existe parce
qu'il est très utile pour les fichiers qui ne peuvent contenir que des
caractères, et aucune autre mise en forme. Il n'existe en général pas de
caractère dédié à d'autres mises en forme, comme le gras et l'italique, tout
dépend du logiciel utilisé.
</p>
<p>
En bref, un texte est une suite de caractères.
</p>
<h3>
<a name="s1_2" id="s1_2">Fichiers, octets</a>
</h3>
<p>
Depuis le temps, vous savez probablement déjà qu'un fichier sur un
ordinateur n'est ni plus ni moins qu'une suite d'<em>octets</em>, c'est à
dire en quelque sorte des nombres entre 0 et 255. À vrai dire, on pourrait
aussi bien les penser comme 256 parfums possibles pour des glaces, ou 256
couleurs possibles : 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ère naturelle de le
faire), ou comme autre chose si on préfère.
</p>
<p>
Toute la difficulté réside dans le fait de représenter une suite de
caractères par une suite d'octets. Nous allons voir que ce n'est pas si
simple.
</p>
<h2>
<a name="s2" id="s2">Les premières solutions</a>
</h2>
<h3>
<a name="s2_1" id="s2_1">Les informaticiens sont joueurs</a>
</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èmes
sans fin. Une telle imprévoyance a défrayé la chronique il y a peu : le
fameux bug de l'an 2000 (sauf que ç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ème de la représentation de textes est
probablement le domaine où elle se fait le plus cruellement sentir, et le
problème n'est pas encore près d'être complètement résolu.
</p>
<p>
Tout commence par une constatation très simple : les premiers
informaticiens parlaient anglais. Et l'anglais s'écrit avec pas grand
chose : deux fois 26 lettres, 10 chiffres, une trentaine de signes de
ponctuation, de signes mathématiques, sans oublier le symbole dollar : avec
95 caractères au total on peut se débrouiller.
</p>
<p>
À l'époque dont je parle, on ne pouvait utiliser que la moitié des octets,
soit 128 valeurs. On en a pris 33 comme caractères de « contrôle » (dont
le retour à 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 écrire l'anglais. On a numéroté tout ça, ça a donné le
code <abbr lang="en_US" title="American Standard Code for Information Interchange" xml:lang="en_US">ASCII</abbr> :
une correspondance entre les octets de 0 à 127 avec des codes de contrôle et
les 95 caractères utiles pour taper de l'anglais.
</p>
<p>
La solution était donc toute simple : un octet par caractère, un caractère
par octet, pourquoi se fatiguer ?
</p>
<h3>
<a name="s2_2" id="s2_2">Les Européens veulent jouer aussi</a>
</h3>
<p>
Bien sûr, au bout d'un moment, il y a des gens qui ont eu envie de pouvoir
taper du français ou de l'allemand sur leur ordinateur. Heureusement, entre
temps, il était devenu possible d'utiliser les valeurs laissées de côté par
l'ASCII. Dans cette place, il a été possible de caser les caractères
accentués et divers autres symboles utilisés par les langues d'europe de
l'ouest.
</p>
<p>
Dans le même temps, les informaticiens russes ont profité 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è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çais, pas du grec ; en Grèce on tape du grec, pas du
Cyrillique ; en Russie on tape du cyrillique, pas du français. Les
ordinateurs étaient configurés pour que le clavier envoie certains codes,
que l'écran affiche certains caractères, et que tout marche bien comme ça.
Bien sûr ça ne marche plus du tout si on franchit la frontière, ou si on va
chez le voisin qui a un ordinateur d'une marque différente, mais ce n'est
pas grave.
</p>
<h3>
<a name="s2_3" id="s2_3">Les encodages</a>
</h3>
<p>
Non, bien sûr, tout ceci ne pouvait pas durer. Pour le problème de pouvoir
taper plusieurs langues sur un même ordinateur, la solution est simple : il
suffit d'étiqueter chaque fichier, celui-ci est en français, celui-ci en
grec.
</p>
<p>
Mais il fallait aussi que les ordinateurs puissent communiquer entre eux
même en étant de marques différentes. Donc au lieu que chaque fabricant
invente sa propre correspondance entre octets et caractères, des organismes
de standardisation s'y sont mis. Ça a donné des tables de correspondance,
comme l'ISO-8859-1, qui propose un jeu de caractè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èmes n'é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ères, on peut le lire sans problème.
</p>
<h3>
<a name="s2_4" id="s2_4">Et les langues orientales dans tout ça ?</a>
</h3>
<p>
Bon, tout ça c'est très bien, mais même en tassant très fort, on n'arrivera
pas à faire rentrer les 1945 idéogrammes du japonais officiel dans un octet
(sans compter ceux qui servent pour les noms propres, ni l'alphabet
syllabique). Ni les 11172 syllables coréennes, ni les dizaines de
milliers d'idéogrammes chinois qu'on arrive à recenser.
</p>
<p>
Les informaticiens orientaux ont donc dû inventer leurs propres méthodes,
des codages qui abandonnaient la correspondance un octet = un caractè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 êtes un
indécrotable idéaliste qui n'a rien compris à l'informatique.
</p>
<h3>
<a name="s2_5" id="s2_5">État des lieux</a>
</h3>
<p>
Tout ceci nous amène à un état assez désolant de l'informatique :
</p>
<ul>
<li>Pour les langues « simples », un codage standard avec un octet par
caractère est utilisé.</li>
<li>Les textes sont éventuellement étiquetés par l'encodage qu'ils
utilisent.</li>
<li>Les logiciels occidentaux sont profondément liés à la correspondance un
octet = un caractère.</li>
<li>Les logiciels orientaux utilisent de manière très figée un système
spécifique à une langue.</li>
</ul>
<p>
Ce qui manque à tout ça, c'est la possibilité qu'un même texte (et dans
certains cas un même logiciel) contienne simultanément plusieurs langues
couvertes par des encodages différents. Militons pour le droit des
universitaires russes de faire des thèses sur les traductions de la Bible de
l'hébreu au grec !
</p>
<h2>
<a name="unicode" id="unicode">Unicode</a>
</h2>
<h3>
<a name="s3_1" id="s3_1">Le but du projet</a>
</h3>
<p>
Pour résoudre <em>durablement</em> tous ces problèmes de langues, il s'est
formé un consortium, qui regroupe de grands noms de l'informatique et de la
linguistique : <a href="http://www.unicode.org/">le consortium Unicode</a>.
Sa tâche : recenser et numéroter
tous les caractères existant dans toutes les langues du monde. Au moment où
j'écris ces lignes, le standard publié comporte plus de 110000
caractè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ésenter comme une suite de
nombres. Quelle simplification !
</p>
<h3>
<a name="s3_2" id="s3_2">Les nouveaux codages</a>
</h3>
<p>
Il est possible d'utiliser directement Unicode pour stocker les textes
informatiques, en utilisant plusieurs octets pour codes les caractères : on
appelle ce code UCS-4 parce qu'il utilise 4 octets par caractères, le
consortium Unicode ayant prévu que deux milliards de caractères ne seraient
pas atteints dans l'immédiat.
</p>
<p>
Il existe cependant un autre code largement utilisé avec Unicode. Il
s'appelle UTF-8. Il est un peu plus complexe, il utilise un nombre variable
d'octets par caractères, mais présente certains avantages : il est
compatible avec l'ASCII, de sorte que les parties écrites avec l'alphabet
latin de base d'un texte codé en UTF-8 seront à peu près lisibles même avec
un logiciel qui ne comprend pas ce codage.
</p>
<h3>
<a name="s3_3" id="s3_3">Comment marchent les bons logiciels</a>
</h3>
<p>
Un bon logiciel est maintenant un logiciel qui permet de travailler avec
Unicode. Enfin, là, je parle des logiciels qui ont à gérer du texte, hein,
un Démineur peut très bien continuer à déminer sans se soucier d'Unicode.
Un bon logiciel, disais-je, va travailler autant que possible en Unicode. En
interne, ses données seront probablement codées uniquement en UCS-4 ou UTF-8
selon ce qu'il en fait, mais ça n'a pas besoin d'être visible. L'important
est qu'il saura jongler entre les différents encodages pour communiquer avec
d'autres composants.
</p>
<p>
Prenons l'exemple d'un logiciel de courrier électronique. Les courrier reçus
comportent une indication de leur codage : hop, le logiciel se débrouille
pour en faire de l'Unicode. Il les affiche en convertissant dans le bon
codage pour le système graphique ou le terminal dans lequel il tourne. Quand
on veut répondre, il prépare la citation dans le bon encodage pour
l'éditeur, puis récupère le texte ainsi édité et le reconvertit. À l'envoi,
il va choisir le meilleur encodage, en tenant compte des nécessités (les
caractères utilisés dans le courrier), et du fait que le destinataire n'a
pas forcé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é, parce que le logiciel est à l'interface
entre le réseau, l'utilisateur et l'éditeur de texte, qui peuvent chacun
utiliser un encodage différent. À terme, ce sera probablement de l'UTF-8 de
tous les côtés, et ce sera plus simple.
</p>
<h2>
<a name="s4" id="s4">En pratique</a>
</h2>
<ul>
<li>
<a href="../unix/editeurs/unicode.html">Taper de l'Unicode
avec Vim ou Emacs (ou dans un terminal)</a>
</li>
<li>
<a href="../internet/courrier/international.html">Gérer son
courrier électronique en Unicode avec Mutt</a>
</li>
<li>
<a href="../logiciels/latex/langues.html">Taper du LaTeX en
Unicode</a>
</li>
</ul>
<div class="metainformation">
Auteur : Nicolas George. Dernière modification : 2012-07-15 par Antoine Amarilli.
</div>
</div>
</body>
</html>