tuteurs.ens.fr/www/faq/utf8.html

717 lines
33 KiB
HTML
Raw 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>UTF-8</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="./">FAQ</a>
<ul class="arbre">
<li>
<a href="autres_sites.html">Jourdan, Montrouge</a>
</li>
<li>
<a href="flrn.html">forum</a>
</li>
<li>
<a href="mail.html">e-mails</a>
</li>
<li>
<a href="utf8.html" class="actuel">UTF-8</a>
</li>
<li>
<a href="vie.html">salles info</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>Foire Aux Questions des Tuteurs : Unicode, UTF-8</h1>
<div class="sommaire">
<ul>
<li>
<a href="#s1">Généralités et théorie</a>
<ul>
<li>
<a href="#unicode">Qu'est-ce que le Standard Unicode ?</a>
</li>
<li>
<a href="#caractere">Qu'est-ce qu'un caractère Unicode ?</a>
</li>
<li>
<a href="#utf8">Qu'est-ce que « UTF-8 » ?</a>
</li>
<li>
<a href="#s1_4">Quels types de logiciels gèrent Unicode ?</a>
</li>
</ul>
</li>
<li>
<a href="#terminaux">Terminaux Unicode</a>
<ul>
<li>
<a href="#s2_1">Qu'est-ce qu'un terminal Unicode ?</a>
</li>
<li>
<a href="#uxterm">Comment lancer un terminal Unicode ?</a>
</li>
<li>
<a href="#test">Comment savoir si je suis dans un terminal
Unicode ?</a>
</li>
<li>
<a href="#locales">Comment faire fonctionner des
programmes dans un terminal Unicode ?</a>
</li>
<li>
<a href="#ssh">Quand je me logue par <code>ssh</code>, les caractères
accentués s'affichent n'importe comment </a>
</li>
<li>
<a href="#luit">Comment lancer des programmes ne gérant pas Unicode
dans un terminal Unicode ?</a>
</li>
<li>
<a href="#courrier">Comment lire son courrier dans un terminal
Unicode ?</a>
</li>
</ul>
</li>
<li>
<a href="#editeurs">Éditer des fichiers UTF-8</a>
<ul>
<li>
<a href="#s3_1">Quel éditeur utiliser ?</a>
</li>
<li>
<a href="#s3_2">Mon éditeur n'a pas détecté que mon fichier était en UTF-8, comment
le lui dire ?</a>
</li>
<li>
<a href="#s3_3">Je veux enregistrer mon fichier dans un autre encodage. Comment
faire ?</a>
</li>
<li>
<a href="#latex">Comment mettre en page du texte dans des langues
exotiques avec LaTeX ?</a>
</li>
</ul>
</li>
<li>
<a href="#x11">Programmes graphiques</a>
<ul>
<li>
<a href="#s4_1">Quels programmes graphiques gèrent Unicode ?</a>
</li>
<li>
<a href="#fontes">Quelles fontes utiliser pour afficher des caractères
Unicode ?</a>
</li>
</ul>
</li>
<li>
<a href="#internet">Unicode et Internet</a>
<ul>
<li>
<a href="#html">Comment insérer un caractère
Unicode dans une page Web ?</a>
</li>
<li>
<a href="#s5_2">Mon navigateur Web affiche mal mes caractères
Unicode. Que faire ?</a>
</li>
<li>
<a href="#test-navigateur">Comment déterminer dans quelle mesure mon navigateur gère
Unicode ?</a>
</li>
</ul>
</li>
<li>
<a href="#s6">Divers</a>
<ul>
<li>
<a href="#troll">Je voudrais mettre des accents dans mes noms de
fichiers, et ça me marche pas. Que faire ?</a>
</li>
</ul>
</li>
</ul>
</div>
<p>Cette Foire Aux Questions (<a href="../jargon.html#FAQ">FAQ</a>) rassemble entre autres des
questions fréquemment posées dans le courrier électronique adressé aux
tuteurs concernant Unicode, qui est un standard qui se répand de plus en
plus, notamment dans les
distributions <a href="../jargon.html#linux">Linux</a> grand
public (et aussi sous Windows).</p>
<h2>
<a name="s1" id="s1">Généralités et théorie</a>
</h2>
<h3>
<a name="unicode" id="unicode">Qu'est-ce que le Standard Unicode ?</a>
</h3>
<p>Le <a href="http://www.unicode.org/">Standard Unicode</a> est produit
par une organisation à but non lucratif (le Consortium Unicode) ayant
pour objectif d'attribuer un numéro à tout caractère utilisé dans une langue
humaine. Cette entreprise vise à une certaine universalité. Les alphabets
de <b>beaucoup</b> de langues sont déjà inscrits dans ce standard. On y trouve
évidemment les alphabets latins, grecs et cyrilliques (avec certaines de
leurs variantes, par exemple, un caractère comme « œ » y figure,
bien qu'il ne soit pas utilisé dans la plupart des autres langues
européennes utilisant l'alphabet latin). Beaucoup de langues parlées en
Asie figurent aussi dans le standard : des dizaines de miliers de
caractères chinois, japonais ou coréens sont définis. Le standard
contient bien d'autres alphabets, la consultation des tableaux de
caractères (dans la version imprimée du standard ou <a href="http://www.unicode.org/charts/">sur le site officiel</a>) est une
véritable source d'émerveillement... </p>
<h3>
<a name="caractere" id="caractere">Qu'est-ce qu'un caractère Unicode ?</a>
</h3>
<p>Un caractère Unicode est un caractère défini dans le Standard Unicode.
On y fait souvent référence par son numéro écrit en hexadécimal précédé
de «U+». Par exemple, la lettre latine « a » correspond à U+0061, la lettre
cyrillique « Я » correspond à U+042F et le "DEVANAGARI OM"
« ॐ » correspond à U+0950. Certains de ces caractères ne
s'affichent peut-être pas correctement sur votre écran, cela dépend de
plusieurs paramètres, nous reviendrons sur ce point dans les questions
suivantes ; il faut cependant garder une chose à l'esprit, le Standard
Unicode définit des listes de caractères, donne un nom à chaque
caractère (pour « a », c'est "LATIN SMALL LETTER A"), mais en aucun
cas, le glyphe devant représenter chaque caractère n'est normalisé, en
effet, plusieurs fontes de caractères peuvent être utilisées.</p>
<h3>
<a name="utf8" id="utf8">Qu'est-ce que « UTF-8 » ?</a>
</h3>
<p>"UTF" est formé des initiales de "Unicode Transformation Format".
Les ordinateurs stockent et échangent leurs données le plus souvent
sous forme de suite d'octets, un octet étant constitué 8 bits. Un
octet peut donc être représenté comme un nombre entier compris (au
sens large) entre 0 et 255. Si on veut stocker sur un support
informatique un texte constitué de caractères Unicode, il faut choisir
un procédé transformant une suite de caractères Unicode en une suite
d'octets et réciproquement avoir un procédé pour retrouver la suite de
caractères à partir d'une suite d'octets bien formée, ces données
constituent ce que l'on appelle
un <a href="../theorie/encodages.html">encodage</a>.
</p>
<p>L'encodage le plus pratique pour échanger des textes constitués de
caractères Unicode est UTF-8. Il associe à tout numéro Unicode
une suite d'un ou plusieurs octets (jusqu'à quatre octets pour un seul
caractère). Cet encodage est décrit dans la <a href="http://www.faqs.org/rfcs/rfc2279.html">RFC 2279</a>.
Une des propriétés importantes de cet encodage est que les caractères
dont les numéros sont compris entre 32 et 126 possèdent la même
représentation en UTF-8 et dans l'encodage ASCII. L'encodage UTF-8 est
donc compatible avec ASCII, dans la mesure où il n'y a rien à faire pour
convertir un fichier encodé en ASCII vers UTF-8. Réciproquement, si un
octet représentant un nombre compris entre 32 et 126 apparaît dans un
fichier encodé en UTF-8, alors c'est forcément pour encoder le caractère
ASCII du même numéro.</p>
<h3>
<a name="s1_4" id="s1_4">Quels types de logiciels gèrent Unicode ?</a>
</h3>
<p>
La question de savoir si un logiciel gère bien Unicode n'a de sens que
si celui-ci manipule du texte. Les logiciels les plus concernés sont
notamment les <a href="#editeurs">éditeurs de texte</a>,
les logiciels de traitement de texte,
les logiciels de <a href="#courrier">courrier électronique</a>
et les <a href="#test-navigateur">navigateurs Web</a>.
</p>
<h2>
<a name="terminaux" id="terminaux">Terminaux Unicode</a>
</h2>
<h3>
<a name="s2_1" id="s2_1">Qu'est-ce qu'un terminal Unicode ?</a>
</h3>
<p>Un terminal (ou un émulateur de terminal) consiste en une interface
qui permet de saisir et d'afficher du texte, divers programmes peuvent
« tourner » à l'intérieur de ce terminal : un interpréteur de
commandes (<em>shell</em>), un logiciel pour gérer ses mails, un
éditeur de texte, etc... Le terminal et les programmes qui tournent à
l'intérieur d'icelui doivent se mettre d'accord d'une manière ou d'une
autre pour savoir dans quel encodage le texte est échangé entre eux,
et ce de façon cohérente avec les caractères effectivement affichés à
l'écran et le texte saisi par l'utilisateur.</p>
<p> Un terminal Unicode (ou UTF-8) est un terminal où cet encodage est
UTF-8, par opposition aux terminaux « ordinaires » où l'encodage
est mono-octet (c'est-à-dire ne permet de représenter qu'un peu moins de
256 caractères différents), le plus souvent <code>latin-1</code> en
France. </p>
<p>
Dans un terminal Unicode, on peut ainsi afficher beaucoup plus de
caractères différents que dans un terminal <code>latin-1</code>. Cela
reste néanmoins une interface en mode texte, on ne pourra ainsi pas
afficher correctement du texte dans des langues dont l'écriture utilise
des systèmes de ligatures complexes ; pour le reste, cela
fonctionne très bien. Il y a quelques subtilités, les caractères
chinois/japonais/coréens occupent ainsi deux cases contiguës au lieu
d'une seule.
</p>
<h3>
<a name="uxterm" id="uxterm">Comment lancer un terminal Unicode ?</a>
</h3>
<p>Il existe beaucoup d'émulateurs de terminaux sous Unix, certains
savent gérer Unicode, d'autres non. Le programme
de référence <code>xterm</code> sait faire, pour le lancer de façon à
obtenir un terminal Unicode, le plus commode est d'utiliser la commande
<code>uxterm</code> qui est en général un script qui lance
<code>xterm</code> avec les bonnes options.
</p>
<p>Sous Windows, notons que le programme <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> qui
est à la fois un client SSH et un émulateur de terminal sait gérer
Unicode, il suffit de choisir UTF-8 comme encodage.
</p>
<div class="ens">
Dans les <a href="../unix/config/2007/">configs conscrits</a> récentes, à partir
du Menu, on peut cliquer sur « Fenêtres » puis sur
« Terminal Unicode ».
</div>
<h3>
<a name="test" id="test">Comment savoir si je suis dans un terminal
Unicode ?</a>
</h3>
<p>
La manière la plus rapide est probablement de taper la suite de
touches
«xxd<code>&lt;Enter&gt;&lt;Compose&gt;&lt;apostrophe&gt;</code>e<code>&lt;Enter&gt;&lt;Control-D&gt;</code>».
Autrement dit, on lance le programme <code>xxd</code> qui va servir à
afficher la représentation en hexadécimal du texte que l'on va
saisir : on saisit un e accent aigu avec la touche compose,
on valide et on ferme avec <code>&lt;Control-D&gt;</code>. Si on se trouve dans
un terminal <code>latin-1</code>, on va voir :
</p>
<pre><span class="prompt">sas ~ $</span> xxd
é
0000000: e90a ..
</pre>
<p class="continue">tandis que dans un terminal Unicode, on
verra :</p>
<pre><span class="prompt">sas ~ $</span> xxd
é
0000000: c3a9 0a ...
</pre>
<p class="continue">Le <code>0a</code> que l'on voit dans les deux
résultats représente le caractère <code>U+00A0</code> LINE FEED (LF) qui
s'encode de la même manière en <code>latin-1</code> et en UTF-8. La
différence porte donc sur l'encodage du caractère <code>U+00E9</code> LATIN
SMALL LETTER E WITH ACUTE (le e accent aigu), en
<code>latin-1</code>, on le
représente par un seul octet de valeur hexadécimale <code>e9</code>
tandis qu'en UTF-8, on a deux octets : <code>c3</code> puis
<code>a9</code>.
</p>
<p>
Une autre manière de le déterminer consiste à utiliser la sortie du
terminal plutôt que son entrée. On va envoyer sur la sortie la
représentation en UTF-8 du e accent aigu, si on voit effectivement un e
accent aigu, on sera dans un terminal UTF-8, si on voit deux caractères
qui n'ont rien à voir (en l'occurence «Ã©»), cela voudra probablement
dire que l'on est dans un terminal <code>latin-1</code>.
Pour faire ce test, on peut
utiliser la commande suivante :
</p>
<pre><span class="prompt">sas ~ $</span> printf '\xc3\xa9\n'
</pre>
<h3>
<a name="locales" id="locales">Comment faire fonctionner des
programmes dans un terminal Unicode ?</a>
</h3>
<p>
La seule méthode vaguement standardisée pour spécifier aux programmes
dans quel encodage est encodé le terminal dans lequel ils fonctionnent
est donné par les <em>locales</em>. Pour connaître le réglage des
<em>locales</em> que les
programmes vont subir, on peut utiliser la commande <code>locale</code>
(qui existe au moins sous GNU/Linux et sous Solaris). Dans un terminal
Unicode, j'obtiens ceci :</p>
<pre><span class="prompt">sas ~ $</span> locale
LANG=
LC_CTYPE=fr_FR.UTF-8
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
</pre>
<p class="continue">Ce qui est important ici, c'est ce qui figure en face
de <code>LC_CTYPE</code>. La valeur <code>fr_FR.UTF-8</code> signifie en gros
que j'utilise du français de France (et non du français de Suisse par
exemple) <em>encodé en UTF-8</em>. Si <code>LC_CTYPE</code> contenait
une valeur n'indiquant pas un encodage UTF-8, comme <code>C</code>,
<code>en_US</code> ou encore <code>fr_FR</code>, je pourrais changer
cette locale en tapant la commande suivante qui permet de modifier la
variable d'environnement <code>LC_CTYPE</code> :
</p>
<pre><span class="prompt">sas ~ $</span> LC_CTYPE=fr_FR.UTF-8;export LC_CTYPE
</pre>
<p class="continue">La modification s'appliquera pour les applications
lancées par la suite dans ce terminal. La variable d'environnement
<code>LC_MESSAGES</code> peut également être utile, elle indique aux
programmes qui en sont conscients dans quelle langue on souhaite qu'ils
nous parlent. Par exemple, si on est dans un terminal Unicode et que
l'on a défini les variables d'environnement <code>LC_CTYPE</code> et
<code>LC_MESSAGES</code> à <code>fr_FR.UTF-8</code>,
les messages qu'affichera un logiciel de courrier électronique comme
<a href="../internet/courrier/mail-mutt.html"><code>mutt</code></a>
seront en français.</p>
<h3>
<a name="ssh" id="ssh">Quand je me logue par <code>ssh</code>, les caractères
accentués s'affichent n'importe comment </a>
</h3>
<p>De plus en plus de distributions Linux ont par défaut des terminaux
Unicode.
Si on se logue sur une autre machine Unix, il faut y faire un
<a href="#locales">réglage de <em>locales</em></a> pour pouvoir utiliser
convenablement certains programmes. Il n'y a rien de prévu au niveau
de <code>ssh</code> (tant mieux, ça pourrait être pire que rien...) pour
définir sur la machine distante une locale cohérente avec l'encodage du
terminal dans lequel on travaille. Si ce n'est pas fait, les programmes
auront tendance à fonctionner comme dans un terminal <code>latin-1</code>,
d'où le n'importe quoi. En principe, on doit donc faire manuellement le
réglage de <em>locales</em> évoqué ci-dessus.
</p>
<div class="ens">
Dans les configs conscrits récentes (à partir de 2004), un script
d'initialisation tente à chaque login distant de procéder à une détection
de l'encodage du terminal, si ce programme détecte un terminal Unicode,
il définit la variable d'environnement <code>LC_CTYPE</code> à
<code>fr_FR.UTF-8</code> ce qui évite d'avoir à faire à chaque fois le
réglage de <em>locales</em> manuellement. Pour éviter toute ambiguité,
cette détection d'encodage ne concerne que les connexions <em>vers</em>
un ordinateur de l'École.
</div>
<h3>
<a name="luit" id="luit">Comment lancer des programmes ne gérant pas Unicode
dans un terminal Unicode ?</a>
</h3>
<p>Certains logiciels ne gèrent pas bien du tout Unicode, il faut donc
les lancer dans un terminal encodé en <code>latin-1</code>. Mais si on
est en train de travailler dans un terminal Unicode, on a pas forcément
envie d'ouvrir une nouvelle fenêtre de terminal. Le programme
<code>luit</code> permet d'émuler un terminal <code>latin-1</code> à
l'intérieur d'un terminal Unicode. Si on est dans un terminal
Unicode, on peut ainsi utiliser la commande suivante :
</p>
<pre><span class="prompt">corvette ~ $</span> LC_CTYPE=fr_FR luit
</pre>
<p class="continue">Cela ouvre un nouveau <em>shell</em>. Les programmes
lancés « à l'intérieur » se comporteront vis-à-vis de
l'utilisateur comme si celui-ci travaillait dans un terminal encodé en
<code>latin-1</code> (on peut faire le <a href="#test">test</a> pour
s'en assurer). On peut lancer par exemple <code>pine</code> (qui ne gère
pas Unicode) dans ce <code>luit</code>. Une fois que l'on en a fini avec
ces programmes ne gérant pas Unicode, on peut revenir au terminal Unicode
de départ en quittant le shell (<code>exit</code> ou
<code>&lt;Control-D&gt;</code>).
</p>
<h3>
<a name="courrier" id="courrier">Comment lire son courrier dans un terminal
Unicode ?</a>
</h3>
<p>
Le logiciel de courrier électronique <a href="../internet/courrier/mail-mutt.html"><code>mutt</code></a>
fonctionne bien dans un terminal Unicode. Grâce à lui, on peut <a href="../internet/courrier/international.html">lire ou
envoyer des messages dans des langues exotiques</a> ; <a href="../logiciels/mozilla/mail.html">Mozilla
Mail</a> sait aussi faire, mais c'est en mode graphique.
</p>
<p>Le logiciel <code>pine</code> ne gère pas Unicode. Il ne peut pas bien
fonctionner dans un terminal Unicode. Si on travaille dans un terminal
Unicode, mais que l'on souhaite quand même lancer <code>pine</code>, il
faut absolument <a href="#luit">transformer provisoirement son terminal
en terminal <code>latin-1</code> avec <code>luit</code></a>.</p>
<div class="ens">
Les <a href="../meta/gourous.html">gourous</a>
ont fait en sorte que si on lance la commande <code>pine</code> dans
un terminal Unicode, le programme <code>luit</code> soit utilisé pour
émuler un terminal <code>latin-1</code>, ce qui fait que l'on peut quand
même utiliser normalement <code>pine</code> ; cependant, on ne
pourra pas y voir ou saisir de caractères exotiques.
</div>
<h2>
<a name="editeurs" id="editeurs">Éditer des fichiers UTF-8</a>
</h2>
<h3>
<a name="s3_1" id="s3_1">Quel éditeur utiliser ?</a>
</h3>
<p>Les dernières versions de <a href="../unix/editeurs/vim.html">Vim</a> et <a href="../unix/editeurs/emacs.html">Emacs</a> gèrent bien
Unicode, on peut les utiliser pour éditer des fichiers encodés en UTF-8
(ou dans d'autres encodages). La page <a href="../unix/editeurs/unicode.html">taper de l'Unicode</a>
donne quelques informations sur l'utilisation de ces éditeurs. On peut
aussi utiliser <a href="http://www.yudit.org/">yudit</a> qui est un très
mauvais éditeur, mais qui est cependant extrêmement bon pour ce qui est
du rendu du texte dans beaucoup de langues (on peut lui spécifier une
fonte pour chaque alphabet, il gère très bien l'écriture de droite à
gauche, les systèmes complexes de ligatures, et il propose un large choix
de méthodes d'entrées).
En revanche, <code>pico</code> (et <code>nano</code>) ne
gèrent pas Unicode.
</p>
<h3>
<a name="s3_2" id="s3_2">Mon éditeur n'a pas détecté que mon fichier était en UTF-8, comment
le lui dire ?</a>
</h3>
<p>On détecte souvent qu'un programme n'est pas conscient qu'un fichier
est encodé en UTF-8 quand chaque caractère accentué est remplacés par
deux caractères bizarres (exemple : « Caractéristique
d'Euler-Poincaré »).
Il faut alors dire à l'éditeur de reconsidérer le fichier pour le traiter
comme de l'UTF-8. Dans Vim, on peut taper <code>:edit ++enc=utf-8</code>
en mode commande. Dans Emacs, aller dans le menu Options, choisir Mule,
puis Set Coding System For Reverting This File Now
(<code>C-x RET r</code>),
taper <code>utf-8</code> et valider.</p>
<h3>
<a name="s3_3" id="s3_3">Je veux enregistrer mon fichier dans un autre encodage. Comment
faire ?</a>
</h3>
<p>Dans Vim, la variable spécifiant l'encodage du fichier que l'on édite
est <code>fileencoding</code>, on peut ainsi faire <code>:set
fileencoding=latin-1</code> ou <code>set fileencoding=utf-8</code> si on
veut changer d'encodage ; cela prendra effet au prochain
<code>:w</code>. Dans Emacs, aller dans le menu Options, choisir Mule,
puis Set Coding System For Saving This Buffer
(<code>C-x RET f</code>), entrer le nom de
l'encodage et valider.</p>
<h3>
<a name="latex" id="latex">Comment mettre en page du texte dans des langues
exotiques avec LaTeX ?</a>
</h3>
<p>Avec LaTeX, on peut mettre en page du texte écrit dans des langues
exotiques. Sur notre <a href="../logiciels/latex/langues.html">page
LaTeX sur les langues exotiques</a>, on trouve la marche à suivre pour
obtenir ce résultat à partir d'un fichier TeX encodé en UTF-8 (au moins
pour du grec, du cyrillique, du chinois et du japonais).
</p>
<p>
Des variantes de TeX/LaTeX ont été développées récemment : Omega/Lambda
puis Aleph/Lamed, aujourd'hui abandonnées, puis
<a href="../logiciels/latex/xetex.html">XeTeX</a> et LuaTeX.
Toutes ces variantes ont pour but de supprimer la limitation de TeX à
256 caractères par police. Aleph gère ainsi des suites de deux octets
(65536 valeurs possibles), XeTeX et LuaTeX lisent par défaut les
fichiers encodés avec UTF-8. Le succès de XeTeX et LuaTeX est dû
notamment à la possibilité d'y utiliser à la fois les polices
fournies avec TeX et les polices TrueType ou OpenType plutôt utilisées
dans les logiciels de traitement de texte traditionnels. Il devient
ainsi possible de taper des textes multilingues, ou dans les langues à
idéogrammes sans devoir affronter le casse-tête de la gestion des
polices avec LaTeX.
</p>
<p>XeTeX permet en outre, grâce à un système appelé TeCKit,
d'appliquer des filtres aux fichiers sources. Cela permet
d'utiliser une translittération dans le fichier source tout en
obtenant les bons caractères dans le fichier d'arrivée.
</p>
<p>Grâce à XeTeX, on a pu ainsi réaliser l'<a href="http://www.eleves.ens.fr/annuaire/">Annuaire
des élèves</a> qui contient quelques citations dans des langues
n'utilisant pas l'alphabet latin.
</p>
<h2>
<a name="x11" id="x11">Programmes graphiques</a>
</h2>
<h3>
<a name="s4_1" id="s4_1">Quels programmes graphiques gèrent Unicode ?</a>
</h3>
<p>En mode graphique, beaucoup de programmes sont concernés par Unicode,
de façon plus ou moins importante.
Les <a href="#terminaux">émulateurs de
terminaux</a> comme <code>xterm</code> le sont évidemment. Plus généralement,
beaucoup de programmes doivent afficher du texte dans des
langues exotiques, par exemple s'ils ont été conçus pour pouvoir
avoir des messages et des menus dans d'autres langues que l'anglais
(voir le <a href="#locales">réglage de la locale
<code>LC_MESSAGES</code></a>). Les programmes utilisant les bibliothèques
<a href="http://www.gtk.org/"><code>GTK+</code></a> disposent
naturellement d'un très bon support d'Unicode ; en effet, les
chaînes de caractères manipulées sont encodées en UTF-8 et la
bibliothèque Pango (faisant partie de <code>GTK+</code>) se charge
d'afficher convenablement le texte, ce qui n'est pas trivial du tout
(par exemple pour les langues indiennes) même si on a de bonnes fontes de
caractères.
</p>
<h3>
<a name="fontes" id="fontes">Quelles fontes utiliser pour afficher des caractères
Unicode ?</a>
</h3>
<p>On peut trouver des <a href="http://www.nongnu.org/freefont/">fontes
TrueType libres</a> (packagées par la plupart des distributions Linux),
elles couvrent notamment la plupart des langues utilisées en Europe
(alphabets latin, cyrillique et grec). Pour utiliser la fonte
<code>FreeMono</code> dans <code>xterm</code>, en supposant que les
fontes évoquées ici soient convenablement installées, on peut utiliser la
commande <code>uxterm -fa FreeMono</code> (pourvu que la version
de <code>xterm</code> utilisée soit suffisamment récente). Si on veut
afficher des caractères provenant d'alphabets non couverts par ces
fontes, il faut évidemment utiliser d'autres fontes... On peut regretter
que <code>xterm</code> ne soit actuellement pas capable d'utiliser
plusieurs fontes simultanément (on pourrait lui spécifier une fonte à
utiliser pour les alphabets latin, cyrillique et grec et une autre fonte
pour les idéogrammes chinois par exemple) ; en revanche,
l'émulateur de terminal <a href="http://software.schmorp.de/#rxvt-unicode"><code>rxvt-unicode</code></a>
peut le faire.
</p>
<h2>
<a name="internet" id="internet">Unicode et Internet</a>
</h2>
<h3>
<a name="html" id="html">Comment insérer un caractère
Unicode dans une page Web ?</a>
</h3>
<p>Il y a deux méthodes. La première consiste à utiliser des entités
HTML : si on insère la chaîne de caractères
«<code>&amp;#x203d;</code>» dans un fichier HTML, le navigateur
affiche «‽» comme vous pouvez le constater, si le navigateur
est en mesure d'afficher ce caractère Unicode, on devrait ainsi voir le
caractère U+203D INTERROBANG. Pour un caractère Unicode quelconque, il
suffit de remplacer <code>203d</code> par la représentation en
hexadécimal du numéro du caractère Unicode. On peut aussi utiliser le
numéro sous sa forme décimale : <code>&amp;#8253;</code> (‽).
</p>
<p>
La deuxième méthode consiste à encoder tout le fichier HTML en UTF-8. On
saisit alors le caractère Unicode comme n'importe quel autre caractère
(ce qui nécessite d'avoir un <a href="#editeurs">éditeur UTF-8</a>). Cela
suppose d'avoir convenablement déclaré l'encodage du fichier HTML. Cela
peut se faire en insérant la balise suivante
</p>
<pre>
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" &gt;
</pre>
<p class="continue">
dans les en-têtes du fichier HTML (entre <code>&lt;meta&gt;</code> et
<code>&lt;/meta&gt;</code>). Si le fichier est en XHTML, il faut fermer
la balise <code>&lt;meta&gt;</code> :
</p>
<pre>
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
</pre>
<p class="continue">
et il est
recommandable de définir l'encodage du fichier en faisant de plus
une déclaration XML sur la première ligne du fichier :
</p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
</pre>
<p>
S'il ne s'agit d'insérer qu'une poignée de caractères exotiques, il
est sans doute plus pratique d'utiliser des entités HTML pour insérer ces
caractères. S'il y en a beaucoup, il devient commode d'utiliser la
deuxième méthode pour éditer directement le fichier HTML dans un
éditeur gérant l'encodage UTF-8. Notons que les deux méthodes ne sont pas
incompatibles, on peut mettre des entités HTML du type ci-dessus dans un
fichier HTML, quelque soit son encodage, y compris UTF-8.
</p>
<h3>
<a name="s5_2" id="s5_2">Mon navigateur Web affiche mal mes caractères
Unicode. Que faire ?</a>
</h3>
<p>Certains navigateurs (comme <a href="../logiciels/mozilla/">Mozilla</a>) permettent de
spécifier une fonte à utiliser pour tel ou tel groupe de langues. Quand
on insère du texte dans une langue exotique, on a ainsi intérêt à
déclarer la langue dans laquelle est écrit le texte, cela permet au
navigateur de choisir directement la bonne fonte à utiliser pour afficher
les caractères, au lieu de parcourir toutes les fontes existantes jusqu'à
en trouver une qui associe un glyphe au numéro Unicode voulu. Ceci peut
donner des résultats horribles : imaginons que vous ayez un texte en grec
ancien avec beaucoup d'accents et d'esprits et que la fonte par défaut ne
contienne que les caractères grecs de base (sans les accents), on risque
de se retrouver avec un mélange du plus mauvais effet entre deux fontes
de caractères, la fonte de base utilisée pour les caractères non
accentués et une autre pour les caractères plus compliqués ; si le
navigateur est prévenu dès le départ que c'est du grec ancien, il fera
sans doute mieux.
</p>
<p>
Pour insérer le mot Hindi <a style="text-align: left;"><cite lang="hi" xml:lang="hi">बिरयानी</cite></a>
dont une transcription est « biryânî », on a utilisé le code
suivant :
</p>
<pre>
&lt;cite lang="hi" xml:lang="hi"&gt;&amp;#x92c;&amp;#x93f;&amp;#x930;&amp;#x92f;&amp;#x93e;&amp;#x928;&amp;#x940;&lt;/cite&gt;
</pre>
<p>
Les attributs <code>lang</code> et <code>xml:lang</code> s'appliquent à
beaucoup d'autres éléments (X)HTML, <code>&lt;p&gt;</code> et
<code>&lt;a&gt;</code> notamment. Sauf cas particuliers, le code de la langue
(dans l'exemple, c'est <code>hi</code>) doit être un code à deux
lettres figurant dans le <a href="http://fr.wikipedia.org/wiki/ISO_639">standard ISO 639</a>.
</p>
<h3>
<a name="test-navigateur" id="test-navigateur">Comment déterminer dans quelle mesure mon navigateur gère
Unicode ?</a>
</h3>
<p>On peut utiliser la <a href="http://www.madore.org/~david/misc/unitest/">page de test
Unicode</a> sur le site de David A. Madore. Attention, cependant, ce
n'est pas parce que vous voyez plein de caractères exotiques disposés un
peu partout que votre navigateur gère parfaitement les langues étrangères
censément représentées sur la page, si on regarde plus attentivement
certains détails, il arrive souvent que l'on voie des bugs (problèmes
dans les fontes de caractères, support rudimentaire de certaines langues,
mélange disgracieux entre plusieurs fontes de caractères pour afficher le
grec, absence de certaines ligatures, etc...). </p>
<h2>
<a name="s6" id="s6">Divers</a>
</h2>
<h3>
<a name="troll" id="troll">Je voudrais mettre des accents dans mes noms de
fichiers, et ça me marche pas. Que faire ?</a>
</h3>
<p>C'est une très mauvaise idée de vouloir mettre des caractères
accentués (ou exotiques) dans les noms de fichiers. Le fait de mettre des
espaces pose déjà des problèmes, des caractères comme «/», «\» ou «:»
sont prohibés sur certains systèmes de fichiers, alors vouloir mettre
des accents, ce n'est que chercher des ennuis supplémentaires (notamment
quand on veut transférer des fichiers sur un autre ordinateur ou sur une
disquette). Bref, à éviter absolument.</p>
<div class="metainformation">
Auteurs : Joël Riou, Rémy Oudompheng.
Dernière modification : 2013-10-20 par Antoine Amarilli.
</div>
</div>
</body>
</html>