<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "dtd/xml/4.1.2/docbookx.dtd" [
<!ENTITY % afnic_custom SYSTEM "../lib/afnic-docbook.inc">
<!ELEMENT rfc EMPTY>
<!ATTLIST rfc num CDATA #IMPLIED>
<!ENTITY % local.para.char.mix "|rfc">
<!-- http://www.sagehill.net/xml/docbookxsl/ModularDoc.html#UsingXinclude --><!ELEMENT xi:include (xi:fallback)?>
<!ATTLIST xi:include xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">
<!ATTLIST xi:include href CDATA #REQUIRED>
<!ATTLIST xi:include parse (xml | text) "xml">
<!ATTLIST xi:include encoding CDATA #IMPLIED>
<!ELEMENT xi:fallback ANY>
<!ATTLIST xi:fallback xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">
<!-- Where are they allowed? --><!ENTITY % local.divcomponent.mix "| xi:include">
<!-- inside chapter or section elements                --><!-- inside para, programlisting, literallayout, etc.  --><!ENTITY % local.info.class "| xi:include">
<!-- inside bookinfo, chapterinfo, etc.                --><!ATTLIST book xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">
<!ATTLIST article xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">
<!ATTLIST chapter xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">
<!ATTLIST section xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude">
<!-- $Id: afnic-docbook.inc,v 1.3 2003/08/07 09:35:14 bortzmeyer Exp $ -->]>
<!-- $Id: unicode.db,v 1.16 2003/11/24 10:09:11 bortzmeyer Exp $ -->
<article xmlns:xi="http://www.w3.org/2001/XInclude" lang="fr">
  <title>Unicode : traiter toutes les écritures du monde</title>
  <articleinfo>
    <author>
      <firstname>Stéphane</firstname>
      <surname>Bortzmeyer</surname>
      <affiliation>
	<orgname>AFNIC</orgname>
	<address><email>bortzmeyer@nic.fr</email></address>
      </affiliation>
    </author>
    <date>$Date: 2003/11/24 10:09:11 $</date>
    <copyright>
      <year>2003</year>
      <holder>AFNIC</holder>
    </copyright>
    <releaseinfo>$Id: unicode.db,v 1.16 2003/11/24 10:09:11 bortzmeyer Exp $</releaseinfo>
    <legalnotice>
<para>Ce document est distribué sous les termes de la <ulink url="http://www.gnu.org/licenses/licenses.html#FDL">GNU Free
      Documentation License</ulink>. <phrase lang="en">Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.2
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.</phrase>
</para>
    </legalnotice>
    <othercredit>
      <firstname>Patrick</firstname>
      <surname>Andries</surname>
      <affiliation>
	<address><email>hapax@iquebec.com</email></address>
      </affiliation>
      <contrib>Plein de bonnes suggestions en français :
      vocabulaire Unicode, notamment</contrib>
    </othercredit>
    <othercredit>
      <firstname>Marianne</firstname>
      <surname>Roger</surname>
      <affiliation>
	<address><email>maroger@maretmanu.org</email></address>
      </affiliation>
      <contrib>Relecture attentive</contrib>
    </othercredit>
    <othercredit>
      <firstname>Sophie-Charlotte</firstname>
      <surname>Barrière</surname>
      <affiliation>
	<address><email>sc.barriere@crezan.net</email></address>
      </affiliation>
      <contrib>Relecture attentive</contrib>
    </othercredit>
  </articleinfo>
  <abstract>
    <para>Au contraire d'ASCII et même de Latin-1, Unicode permet de
représenter la quasi-totalité des écritures utilisées dans le monde. Une autre
particularité d'Unicode est qu'il est conçu selon un modèle en
couches, avec séparation du répertoire de caractères et de leur
représentation en bits. Cet exposé présentera le jeu de caractères
Unicode  et les encodages comme UTF-8 (très utilisé dans les
protocoles Internet).<remark>Voir <xref linkend="unicode.français"/>, <xref linkend="unicode-debian"/>, <xref linkend="unicode-howto"/>,
et <xref linkend="gillam.unicode"/> .</remark></para>
  </abstract>
  <section xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Textes et informatique : une introduction</title>
    <para>Depuis belle lurette, on représente les textes sous forme de
    0 et de 1 dans la mémoire des ordinateurs. Cette représentation
    nécessite une formalisation à laquelle les écritures (et ceux qui
    les connaissent et les étudient) n'étaient pas
    toujours préparées. Le domaine est donc assez miné, et le
    vocabulaire complexe (<xref linkend="unicode.glossary"/>).</para>
    <para>Quelques rappels sont donc nécessaires.</para>
    <section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Langue et écriture</title>
      <para>Ce sont deux choses différentes : le turc est passé de
    l'alphabet arabe à l'alphabet latin au début du XX<superscript>ème</superscript> siècle. À la
    Bibliothèque Nationale, on peut admirer une Bible en espagnol
    composée avec des caractères arabes. En effet, quant une partie de l'Espagne
    était occupée par des Arabes, l'espagnol s'écrivait avec
    l'alphabet des dirigeants.</para>
      <para>Certaines langues s'écrivent couramment avec deux alphabets
    comme le serbo-croate, qui utilise l'alphabet latin en Croatie et
    l'alphabet cyrillique en Serbie.</para>
      <para>On verra qu'Unicode ne s'occupe que des écritures, pas des
    langues.</para><para>De même, à propos des <link linkend="idn">noms de domaines
    Unicode</link> dans le DNS (<xref linkend="RFC3490"/>), il est
    inapproprié de parler de &quot;noms de domaines multilingues&quot;.</para>
    </section>
      <section xmlns:xi="http://www.w3.org/2001/XInclude">
	<title>Le concept de caractère</title>
	<para>La norme Unicode utilise ce terme mais il est trompeur :
	il peut faire penser à des écritures alphabétiques, comme les
	alphabets grecs ou arabes, alors qu'il existe des écritures
	non-alphabétiques, notamment en Asie (écriture idéographique
	en Chine et idéo-syllabique au Japon).</para>
	<para>Certains préfèrent donc éviter complètement le terme de
	caractère.</para>
      </section>
      <section xmlns:xi="http://www.w3.org/2001/XInclude">
	<title>La variété du monde</title>
	<para>Chaque fois que l'on croit avoir tout normalisé, on
	découvre une écriture qui comporte des exceptions aux règles
	que l'on croyait complètes. </para>
	<para>Pensons aux écritures de droite à gauche, aux écritures en lacet (un coup à gauche, un
	coup à droite), aux écritures à casses différentes
	(majuscules/minuscules, qui sont très déroutantes pour ceux
	qui ont appris avec un alphabet qui n'a pas ce concept), etc.</para>
      </section>
      <section xmlns:xi="http://www.w3.org/2001/XInclude">
	<title>La forme</title>
	<para>On le verra, Unicode gère des caractères abstraits, pas
	des formes (glyphes), en raison de la grande variété de formes
	pour une même lettre (et les concepteurs de polices de
	caractères en inventent régulièrement des nouvelles).</para>
	<para>La norme Unicode présente des glyphes, mais à des fins
	d'illustration uniquement. Unicode n'est
	<emphasis>pas</emphasis> une police de caractères.</para>
      </section>
  </section>
  <section xmlns:xi="http://www.w3.org/2001/XInclude">
      <title>Un modèle pour la représentation de caractères</title>
<para>Unicode est défini suivant un modèle en couches (<xref linkend="unicode.utr17"/>). Les autres normes ne
faisaient typiquement pas de distinction entre, par exemple, le jeu de
caractères et la représentation physique. On va présenter les couches,
en partant de la plus haute (la plus éloignée de la machine).</para>
      <section xmlns:xi="http://www.w3.org/2001/XInclude">
	<title>Jeu de caractères abstraits (<foreignphrase>Abstract Character
	Repertoire</foreignphrase>)</title>
	<para>La couche la plus élevée est la définition du jeu de
	caractères. Par exemple, Latin-1 a un jeu de 256 caractères et
	Unicode normalise actuellement près de 100 000 caractères. En
	outre, Unicode leur donne des noms<footnote><para>Les noms
	utilisés ici sont les noms officiels français extraits de
	l'<ulink url="http://pages.infinit.net/hapax/ListeDesNoms.txt">ISO 10646 (F)</ulink>.</para>
	</footnote>.</para>
	<para>La table suivante est donc le cœur d'Unicode.
      <table>
	    <title>Une partie d'Unicode</title>
	    <tgroup cols="2">
	      <tbody>
		<row>
		  <entry lang="en">Lettre majuscule latine a</entry>
		  <entry>A</entry>
		</row>
		<row>
		  <entry lang="en">Lettre majuscule latine c cédille</entry>
		  <entry>Ç</entry>
		</row>
		<row>
		  <entry lang="en">Lettre minuscule grecque lambda</entry>
		  <entry>λ</entry>
		</row>
		<row>
		  <entry lang="en">Lettre hébraïque alef</entry>
		  <entry>ℵ</entry>
		</row>
	      </tbody>
	    </tgroup>
	  </table></para>
      </section>
      <section xmlns:xi="http://www.w3.org/2001/XInclude">
	<title>Jeu de caractères codés (<foreignphrase>Coded Character Set</foreignphrase>)</title>
	<para>Ici, on ajoute à la table précédente un index
	numérique. Notons bien qu'il ne s'agit pas d'une
	représentation en mémoire, juste d'un nombre.
      <table>
	    <title>Une partie d'Unicode</title>
	    <tgroup cols="2">
	      <tbody>
		<row>
		  <entry>U+0041</entry>
		  <entry lang="en">Lettre majuscule latine a</entry>
		  <entry>A</entry>
		</row>
		<row>
		  <entry>U+00C7</entry>
		  <entry lang="en">Lettre majuscule latine c cédille</entry>
		  <entry>Ç</entry>
		</row>
		<row>
		  <entry>U+03BB</entry>
		  <entry lang="en">Lettre minuscule grecque lambda</entry>
		  <entry>λ</entry>
		</row>
		<row>
		  <entry>U+0500</entry>
		  <entry lang="en">Lettre hébraïque alef</entry>
		  <entry>ℵ</entry>
		</row>
	      </tbody>
	    </tgroup>
	  </table></para>
<para>En Unicode, cet index numérique se nomme le point de code (<foreignphrase>code
point</foreignphrase>). Il est noté U+xxxx où xxxx est la valeur de
l'index en hexadécimal. Répétons que c'est juste un index, pas une
représentation en bits.</para>
      </section>
    <section xmlns:xi="http://www.w3.org/2001/XInclude">
      <title>Forme codée en mémoire (<foreignphrase>Character Encoding Form</foreignphrase>) ou
      encodage</title>
      <para>Cette fois, nous arrivons à une représentation en mémoire
      : cette couche spécifie quelles unités de stockage (<foreignphrase>code
      units</foreignphrase>), octets ou bien mots de 16 - seizets - ou de 32 bits, vont représenter un caractère ou plus exactement
      un point de code (<foreignphrase>code
      point</foreignphrase>).</para>
      <para>Une des particularités d'Unicode est qu'il existe
      plusieurs encodages (<foreignphrase>Character Encoding
      Form</foreignphrase>) possibles (exemples <link linkend="encodages">plus loin</link>). Comme ce modèle en
      couches est inhabituel pour les jeux de caractères, il y a
      fréquemment confusion entre Unicode et tel ou tel encodage. Par
      exemple, le paramètre &quot;charset&quot; utilisé dans <link linkend="RFC2045">MIME</link> est mal nommé puisque
      ses valeurs sont des encodages, pas des jeux de caractères.</para>
<para>Du fait de ce modèle en couches successives, des phrases comme
&quot;Unicode est un jeu de caractères sur 16 bits&quot; ne sont pas seulement
fausses, elles sont absurdes.</para>
    </section>
    <section xmlns:xi="http://www.w3.org/2001/XInclude">
      <title>Mécanisme de sérialisation des caractères (<foreignphrase>Character Encoding Scheme</foreignphrase>)</title>
      <para>Cette couche s'occupe de sérialiser les unités de stockage
      (<foreignphrase>code units</foreignphrase>) définies par
      la couche du dessus. C'est ici que se traite l'opposition entre
      gros boutiens et petits boutiens<footnote><para>Les gros
      boutiens sont les processeurs - la grande majorité sauf les i386
      - qui mettent l'octet de plus fort
      poids en premier. Quant un flot de données multi-octets passe
      d'un processeur gros boutien à un petit boutien via le réseau,
      il faut penser à inverser les octets.</para>
	</footnote>. Ce mécanisme 
      définit donc ce que l'<ulink url="http://www.ietf.org/">IETF</ulink> appelle un
      <foreignphrase>on-the-wire
      format</foreignphrase> (format des données vues par un
      observateur qui regarde ce qui passe sur le câble).</para>
<para>C'est également ici qu'on spécifie la marque de boutianité (BOM,
      pour <foreignphrase>Byte Order Mark</foreignphrase>) qui permet
      d'indiquer en début de fichier s'il est en gros boutien ou en
      petit boutien. Dans le monde Internet, on l'utilise rarement, en
      préférant un marquage explicite (charset=UTF-16BE en MIME, par
      exemple, pour indiquer un flot de données gros boutien, avec BE
      pour <foreignphrase>Big Endian</foreignphrase>).</para>
    </section>
    <section xmlns:xi="http://www.w3.org/2001/XInclude">
      <title lang="en">Surcodage de transfert (<foreignphrase>Transfer Encoding Syntax</foreignphrase>)</title>
      <para>Ici, interviennent <emphasis>optionnellement</emphasis>
      les mécanismes de compression ou de chiffrement, que nous
      n'étudierons pas.</para>
      <para>Il peut aussi y avoir un surencodage comme pour le
      LDAP qui spécifie que les chaînes Unicode doivent être
      encodées en UTF-8 et surencodées en Base-64.<!-- C'est où dans la
      spécification ? --> </para>
    </section>
  </section>
  <section xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Les différents jeux</title>
    <section xmlns:xi="http://www.w3.org/2001/XInclude">
      <title>US-ASCII</title>
      <para>Il ne comprend que l'alphabet latin, et sans caractères
      composés (127 caractères en tout).</para>
      <para>Les caractères sont encodés sur 7 bits (en général inclus
      dans un octet dont le bit de poids fort est à zéro).</para>
      <para>Pour écrire, il ne convient donc qu'aux
      anglophones<footnote><para>Et encore puisque certains mots
      anglais en comportent comme
      <foreignphrase>résumé</foreignphrase> (qu'il ne faut pas
      confondre avec <foreignphrase>resume</foreignphrase>).</para>
	</footnote> et aux communications entre ordinateurs (VRFY,
      HELO, POST, GET, etc).</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>ASCII accentué<footnote><para><ulink url="  http://alis.isoc.org/glossaire/iso646.10646.fr.htm">ISO 646</ulink></para>
	</footnote></title>
<para>Les lecteurs les plus âgés se souviennent des imprimantes 7 bits
: incapables de recevoir les octets dont le bit de poids fort était à
un, elles redéfinissaient US-ASCII pour que les motifs correspondant
à des caractères comme { ou } impriment les caractères composés
utilisés en français.</para><para>C'était supportable pour les textes
mais peu pratique pour les programmeurs C ou Perl. Rapidement, tous
les systèmes sont devenus <foreignphrase>8-bits clean</foreignphrase>
et ce jeu de caractères a donc disparu.</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>ISO-8859-X</title>
<para>Ce terme désigne un ensemble de normes ISO<footnote><para>Un
<ulink url="http://babel.alis.com/codage/iso8859/jeuxiso.fr.htm">serveur
Web</ulink> les présentent fort bien.</para>
	</footnote>. La plus connue en France est ISO-8859-1, dite
Latin-1 (<command>man iso_8859_1</command>). Le répertoire comprend
255 caractères. L'encodage est sur 8 bits (un octet). C'est pour
remplacer US-ASCII et &quot;ASCII accentué&quot; par ISO-8859-X qu'il a fallu se battre pour
déployer des systèmes <foreignphrase>8-bits clean</foreignphrase> dans
les années 80-90.</para>
<para>Contrairement à une idée reçue, Latin-1 ne permet pas d'encoder
tous les caractères utilisés en français. La phrase suivante (tirée de
<xref linkend="andre.latin1"/>), qui
inclut tous ces caractères, utilise des caractères extérieurs à
Latin-1 (la ligature œ n'existe pas du tout en Latin-1 et le ÿ n'y existe pas en majuscule).</para>
<para>Dès Noël où un zéphyr haï me
vêt de glaçons würmiens, je dîne d'exquis rôtis de bœuf au kir à
l'aÿ d'âge mûr &amp; cætera !</para> 
<para>Latin-1 sera petit à petit remplacé par Latin-15,
quasi-identique à l'exception du caractère € pour l'euro.</para>
<para>Pour l'écriture grecque, on utilise ISO-8859-7. La partie haute
(bit de poids fort à 1) sert pour l'alphabet grec et la partie basse
pour l'alphabet latin. Cela permet de programmer en C en mettant des
commentaires en grec. Ou bien d'écrire un texte qui mêle le grec et
l'anglais (mais pas le grec et l'allemand).</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Pourquoi Unicode ?</title>
<para>Alors, après tant de jeux de caractères, largement implémentés
et déployés, pourquoi Unicode ?
Parce qu'il est le seul à permettre des textes multi-écritures
(français et grec, par exemple) et le seul qui permet de traiter
toutes les écritures (certaines écritures &quot;rares&quot; n'ont pas de jeu de
caractères en dehors d'Unicode).</para>
<para>Voilà pourquoi je souhaite le succès d'Unicode.</para>
    </section>
  </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Unicode au complet</title>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Les index</title>
<para>Les 128 premiers caractères d'Unicode ont un index qui
correspond aux caractères d'US-ASCII, pour des raisons pratiques
évidentes<footnote><para>Contrairement à beaucoup d'autres normes,
Unicode a beaucoup soigné le côté pratique.</para>
      </footnote>. Ainsi, le petit &quot;d&quot; a pour <foreignphrase>code
point</foreignphrase> U+0064<footnote><para>Ceci est la notation
habituelle des
points de code, en hexadécimal.</para>
      </footnote>, comme en US-ASCII.</para>
<para>Les 128 suivants ont le même index qu'en Latin-1, par exemple
U+OOFE pour le þ, le <foreignphrase>thorn</foreignphrase>
scandinave.</para>
<para>Rappelons qu'il ne s'agit que d'une identité des index, pas des
représentations, un fichier Latin-1 ne sera pas un fichier Unicode
légal, aucun encodage d'Unicode ne correspond à Latin-1.</para>
  </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Les combinaisons</title>
<para>Unicode gère les combinaisons de caractères. Certains caractères
peuvent en effet être définis comme la combinaison de deux ou plus
caractères. Par exemple le ç (c cédille) peut être vu comme la
combinaison de la lettre c et de la cédille combinatoire.</para>
<para>C'est une des raisons pour lesquelles il n'y a pas d'équivalence
entre les caractères au sens Unicode du terme et les caractères perçus
par l'utilisateur. Si un fichier Unicode contient les deux
points de code U+0063 (c) et U+0327
(cédille combinatoire<footnote><para>Il existe aussi une cédille
non-combinatoire, U+00B8.</para>
	</footnote>), l'utilisateur qui l'affiche ne verra
probablement qu'un seul caractère, ç.</para>
<para>En outre, à des fins de compatibilité avec les anciens jeux de
caractères, certaines combinaisons sont précomposées dans Unicode. La
combinaison citée au paragraphe précédent aurait pu être remplacée par
le seul U+00E7 (ç).</para>
<para>L'existence de caractères combinants est une des raisons pour
lesquelles il ne faut <emphasis>jamais</emphasis> comparer deux
chaines de caractères Unicode sans leur avoir fait subir une <link linkend="normalisation">normalisation</link>.</para>
  </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude" id="encodages"><title>Les encodages</title>
<para>Cas unique parmi les jeux de caractères, Unicode permet
plusieurs encodages. La conception d'un bon encodage n'est pas
triviale et chaque encodage a des propriétés distinctes :
<itemizedlist>
	<listitem>
	  <para>Place occupée en mémoire. Ce point est en général
	  celui qui suscite les plus grandes passions. Bien à tort, à
	  l'époque où, sur une page Web, le texte, même encodé avec
	  l'encodage le plus gaspilleur, ne représente qu'une petite
	  partie de la taille totale, vue l'abondance des images fixes, de la
	  vidéo, etc.</para>
	</listitem>
	<listitem>
	  <para>Compatibilité avec les anciennes applications. Par
	  excemple, la libc s'attend à ce que les chaines soient
	  terminées par un octet nul. Un encodage qui produirait des
	  octets nuls lui poserait des problèmes.</para> 
	</listitem>
	<listitem><para>Performances pour des opérations comme la
	sélection du N<superscript>ième</superscript> caractère. Un encodage où tous les
	caractères sont représentés avec la même taille est
	avantagé.</para>
	</listitem>
      </itemizedlist>
</para>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>UCS-2</title>
<para>Cet encodage tient sur 16 bits et ne permet donc pas de
représenter tout Unicode. Les 65 535 premiers caractères d'Unicode sont
nommés le plan multilingue de base (BMP, <foreignphrase>Basic Multilingual Plane</foreignphrase>)
et comportent presque toutes les écritures couramment utilisées, seuls
les idéogrammes chinois manquant largement. UCS-2 n'est guère utilisé,
en raison de cette limite.</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>UCS-4 ou UTF-32</title>
<para>Cet encodage tient sur 32 bits et est le seul où l'index est
identique à la représentation. Si Unicode dépasse un jour les quatre
milliards de caractères<footnote><para>En fait, beaucoup moins, car
un autre encodage, UTF-16, impose d'autres contraintes.</para>
	  </footnote>, il aura les mêmes problèmes qu'UCS-2, mais
cela semble peu vraisemblable. UTF-32/UCS-4 n'est guère utilisé mais,
lorsque vous compilez <ulink url="http://www.python.org/">Python</ulink>, l'option
<command>--enable-unicode=ucs4</command> indique à Python qu'il devra
utiliser UCS-4 en interne pour les chaines Unicode.</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>UTF-16</title>
<para>Comme UCS-2, c'est un encodage 16-bits. Mais il dispose d'un
mécanisme d'échappement, les seizets d'indirection (<foreignphrase>surrogates</foreignphrase>)
qui lui permet de représenter tout Unicode. Java utilise cet encodage
en interne<footnote><para>Il semble que Java ne le mette pas en œuvre
correctement et qu'il <ulink url="http://www.ingrid.org/java/i18n/utf-16/">s'agisse plutôt
d'UCS-2</ulink> (sans les seizets d'indirection). Un tel problème
existe avec d'autres systèmes : l'UTF-8 d'Oracle n'est pas
complètement correct, par exemple.</para>
	  </footnote>.</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>UTF-8, l'encodage de l'Internet ?</title>
<para>UTF-8 (<xref linkend="RFC2279"/>) est peut-être le plus répandu. En effet, il est l'encodage
par défaut en XML (tout processeur XML doit traiter au moins UTF-8 et
UTF-16) et les normes Internet qui utilisent Unicode imposent la
plupart du temps UTF-8.</para>
<para>UTF-8 est le plus compatible avec les anciennes applications
comme celles qui utilisent la libc. Il ne produit pas d'octets nuls,
un caractère ASCII a la même représentation en UTF-8 et en ASCII (ce
qui veut dire que tout fichier ASCII est un fichier UTF-8), les octets
d'ASCII seront forcément une représentation d'un caractère ASCII (ce
qui permet d'utiliser un <application>grep</application> non modifié
sur un fichier UTF-8, tant qu'on ne cherche que des caractères
US-ASCII).</para>
<para>Par exemple, on peut utiliser UTF-8 avec les noyaux Unix
existants, si on veut des noms de fichier en Unicode<footnote><para>En
pratique, le <link linkend="unicode-files">noyau ne faisant pas de normalisation</link>, on aura sans doute
des ennuis.</para>
	</footnote>.</para>
<para>En revanche, comme un caractère Unicode a un nombre d'octets
variable en UTF-8, des opérations comme l'extraction du N<superscript>ième</superscript>
caractère d'une chaîne sont inefficaces.</para>
<para>Perl utilise UTF-8 comme représentation interne des chaines Unicode.</para>
</section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Trouver l'encodage</title>
<para>Tout ceci laisse entière la question de trouver l'encodage d'un
fichier que l'on vient de recevoir ou bien d'un flot de bits qui vient
du réseau. Il existe certaines heuristiques (UTF-8 a une syntaxe telle
que, si un ensemble d'octets est de l'UTF-8 valable, il est très
probablement réellement de l'UTF-8, le hasard seul ne peut pas
produire de l'UTF-8 légal) mais aucune solution générale. Il faut donc
marquer ses fichiers. Dans le courrier, on utilise l'option &quot;charset&quot;
du champ Content-Type
de MIME, pour le Web, une option équivalente peut être utilisée en
HTTP, pour les fichiers en local, ni Unix, ni MS-Windows ne prévoient
de méthode. Lorsqu'on décide de passer à Unicode, il vaut mieux
changer tous ses fichiers d'un coup.</para>
    </section>
    </section>
</section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Diverses questions</title>
<section xmlns:xi="http://www.w3.org/2001/XInclude" id="normalisation"><title>Normalisation</title>
<para>Si on compare deux chaînes de caractère Unicode en comparant
leurs octets, on est sûr de se tromper. En effet, elles n'utilisent
pas forcément le même encodage et la comparaison physique des bits n'a
donc pas de sens.</para>
<para>Or, les applications ont tout le temps besoin de comparer des
textes, pour vérifier l'unicité (noms de domaines, noms de fichiers)
ou pour des signatures cryptographiques, par exemple.</para>
<para>Si on est d'avantage soigneux et qu'on convertit tout en entrée,
de façon à n'utiliser qu'un seul encodage en interne, il reste
d'autres problèmes : les caractères combinants et le fait que certains
caractères, quoique différents pour la norme Unicode
(<foreignphrase>code point</foreignphrase> différents) sont équivalents
dans un contexte donné. Ainsi, la plupart des germanophones
considèrent que 
    <foreignphrase>straße</foreignphrase> et
<foreignphrase>strasse</foreignphrase> sont équivalents. Et &quot;pi au
carré&quot; ? Est-ce que &quot;pi2&quot; est équivalent à &quot;pi²&quot; ? Le second peut être
mieux représenté avec un balisage extérieur (en LaTeX ou en
DocBook). Enfin, les ligatures comme fi ou ff, peuvent être
trompeuses.</para>
<para>Le problème
est encore plus épineux en chinois où il existe plusieurs représentations
du même caractère, depuis une réforme de la graphie.</para>
<para>Si on veut comparer deux chaînes de caractères Unicode, par
exemple pour mettre en œuvre un système de fichiers où les noms
Unicode sont admis, il faut donc normaliser les chaînes avant
comparaison.</para>
<para>Unicode prévoit plusieurs mécanismes de normalisation, que l'on
peut utiliser pour bâtir sa normalisation à soi (le cadre de
normalisation d'Unicode, pour l'Internet, est défini dans <xref linkend="RFC3454"/><footnote><para>Un exemple d'utilisation
figure en <xref linkend="RFC3491"/>.</para>
	</footnote>).</para>
<para>Pour plus de détails, on consultera <xref linkend="unicode.utr15"/>.</para>
<para>Pour voir la normalisation en action, on peut utiliser
l'excellent programme <ulink url="http://www.w3.org/International/charlint/"><application>charlint</application></ulink> du
World-Wide Web Consortium. Par exemple, on a ci-dessous un programme Perl qui
produit des données sous une forme non canonique et un autre programme
Perl qui affiche simplement les caractères Unicode reçus :
<programlisting>
<command><prompt>% </prompt> perl produce-data.pl |  perl consume-data.pl</command>
<computeroutput>
LATIN SMALL LETTER C (Basic Latin)
COMBINING CEDILLA (Combining Diacritical Marks)
LATIN SMALL LETTER E (Basic Latin)
COMBINING ACUTE ACCENT (Combining Diacritical Marks)
</computeroutput>
</programlisting>
Et, en insérant <application>charlint</application> dans le tube :
<programlisting>
<command><prompt>% </prompt>perl produce-data.pl | perl charlint.pl | perl consume-data.pl</command>
<computeroutput>
LATIN SMALL LETTER C WITH CEDILLA (Latin-1 Supplement)
LATIN SMALL LETTER E WITH ACUTE (Latin-1 Supplement)
</computeroutput>
</programlisting>
</para>
<para>Les mots ayant un contenu sémantique (même les identificateurs
dans les programmes), la normalisation peut susciter des débats
vigoureux.</para> 
      <formalpara>
	<title>Quiz</title>
	<para>Par exemple, pour les noms de domaines, considérez-vous
	les noms suivants comme équivalents ?<orderedlist>
	    <listitem>
	      <para><systemitem>café.fr</systemitem></para>
	    </listitem>
	    <listitem>
	      <para><systemitem>CAFÉ.FR</systemitem></para>
	    </listitem>
	    <listitem>
	      <para><systemitem>cafe.fr</systemitem></para>
	    </listitem>
	    <listitem>
	      <para><systemitem>cafê.fr</systemitem> (notez la faute)</para>
	    </listitem>
	  </orderedlist>
</para>
      </formalpara>
</section>
 <section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Casse</title>
<para>Mettre en œuvre un système de nommage indépendant de la casse
est trivial en ASCII : on ajoute ou on retire 32 à l'encodage. Cela ne
marche pas en Unicode, où les tables sont bien plus complexes. Même la longueur des chaînes change 
selon la casse (le majuscule de
<foreignphrase>weiß</foreignphrase> est
<foreignphrase>WEISS</foreignphrase>).</para>
<para>Le consortium Unicode fournit une table de 
    correspondance de casse (<foreignphrase>case folding</foreignphrase>) qu'on peut utiliser
dans ses programmes. Il ne peut pas exister une table qui convienne à
tous car, dans certains cas, le changement de casse peut avoir un
résultat qui dépend du profil (<foreignphrase>locale</foreignphrase>),
par exemple de la
langue de l'utilisateur.</para>
</section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Tri</title>
<para>Le tri pose des problèmes analogues à la normalisation. En
Unicode, on ne peut pas, contrairement à US-ASCII, trier sur la
représentation binaire : il faut introduire plus de sémantique et
consulter des tables.</para>
<para>Par exemple, en Suède et en Finlande, le Ä apparait après le Z
dans les tris, comme l'annuaire du téléphone, ce qui déroute
l'étranger de passage qui cherche son correspondant...</para>
    </section>
    <section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Outils Unicode<footnote>
<para>Cet article a été réalisé avec Emacs en DocBook/XML sur une
machine Debian. Il a été traité avec jade, JadeTeX et xsltproc.</para></footnote>
</title>
<itemizedlist>
<listitem><para><ulink url="http://www.yudit.org/">yudit</ulink>, un éditeur Unicode</para>
	</listitem>
<listitem><para>Depuis la version 21, Emacs commence à avoir une prise
en charge correcte d'Unicode</para>
	</listitem>
<listitem id="charlint"><para><ulink url="http://www.w3.org/International/Charlint/">charlint</ulink>, un
outil de normalisation</para>
	</listitem>
<listitem><para><ulink url="http://www.gnu.org/directory/GNU/recode.html">recode</ulink>, un
convertisseur entre jeux de caractères (<command>recode <replaceable>Latin-1</replaceable>..<replaceable>UTF-8</replaceable>
<replaceable>mon-fichier.txt</replaceable></command>)</para>
	</listitem>
 <listitem><para>iconv, un autre convertisseur, dans la GNU libc</para>
	</listitem>
      </itemizedlist>
      </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Prise en charge d'Unicode dans les programmes</title>
<para>Que veut dire &quot;supporter Unicode&quot; ? Unicode étant désormais un
argument de vente, on voit de nombreux programmes proclamer qu'ils
&quot;supportent Unicode&quot;. Or, il existe plusieurs niveaux de prise en charge :
<orderedlist>
<listitem>
<para>Au minimum, un programme doit pouvoir réaliser des
entrées/sorties en Unicode. En entrée, il devrait accepter au moins
les encodages UTF-8 et UTF-16, en sortie également. Entre les deux, il
ne doit <emphasis>pas</emphasis> modifier les caractères qu'il ne
comprend pas (aucun programme ne peut connaitre la sémantique de tous
les caractères Unicode).</para>
	    </listitem>
	    <listitem>
	      <para>À un niveau de support plus élevé, il devrait
	      pouvoir :
	    <orderedlist>
		  <listitem><para>S'il fait des tris, ne pas trier
		  selon la représentation binaire, mais selon
		  l'<link linkend="unicode.utr10">algorithme de tri d'Unicode</link>.</para>
		  </listitem>
		  <listitem>
		    <para>S'il permet des recherches avec des
		    expressions rationnelles, utiliser les 
		  <link linkend="unicode.utr18">expressions
		    Unicode</link>.</para>
		  </listitem>
		</orderedlist></para>
	    </listitem>
	  </orderedlist>
</para>
      </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Support d'Unicode dans vos programmes</title>
<para>Unicode nous oblige à reconsidérer pas mal de présupposés. Par
exemple, une fonction aussi inoffensive que
<function>strlen</function> doit renvoyer quoi ?
<orderedlist>
	    <listitem><para>Le nombre de graphèmes (ce que
	    l'utilisateur appelerait &quot;caractères&quot;) ?</para>
	    </listitem>
	    <listitem><para>Le nombre de <foreignphrase>code points</foreignphrase> (ce que
	    l'informaticien appelerait &quot;caractères&quot;) ?</para>
	    </listitem>
	    <listitem><para>Le nombre d'octets (ce que
	    ferait un programme naïf<footnote><para>&quot;Naïf&quot; au sens de
	    &quot;écrit par un programmeur qui ne connait pas Unicode et
	    qui est resté au paradigme un caractère == un octet&quot;.</para>
	      </footnote>) ?</para>
	    </listitem>
	  </orderedlist>
</para>
<para>Ainsi, la chaîne &quot;U+0063 U+0327&quot; représente un seul graphème (ç), mais
nécessite deux points de code (si on normalisait, on
pourrait la réduire à un seul) et un nombre d'octets qui dépend de l'encodage.</para>
<para>La distinction entre ces différents sens (qui sont tous
valables, à leur façon), se retrouve dans la plupart des langages de
programmation, qui permettent de différencier entre eux. Voici un
exemple en Perl :
<programlisting>
# &quot;character semantics&quot; vs. &quot;byte semantics&quot; en Perl
# Dans le premier cas, on travaille au niveau du jeu de caractères
# Unicode.
# Dans le deuxième, on ne connait que des octets, sans leur signification.
print $ustring-&gt;length(), &quot;\n&quot;; # Affiche le 
                  # nombre de code points

$utf8 = $ustring-&gt;utf8;
print length($utf8), &quot;\n&quot;; # Affiche le nombre 
                  # d'octets
</programlisting>
</para>
      </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Langages de programmation</title>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Règles générales</title>
<para>Chaque langage utilise un encodage différent en interne :
attention aux entrées/sorties binaires !</para>
<para>Unicode soulève des problèmes de sécurité nouveaux :
<orderedlist>
<listitem>
<para>Vu le
nombre de caractères présents, tester la présence de caractères
interdits a encore moins de sens qu'en US-ASCII. Il faut au contraire
tester que les données ne comportent que des caractères
autorisés.</para>
	      </listitem>
<listitem>
<para>Si vous validez des données, faites-le
<emphasis>après</emphasis> normalisation.</para>
	    </listitem>
<listitem><para>Il y a peu de chances que vous écriviez un décodeur UTF-8 mais,
si c'est le cas, attention, il existe plusieurs pièges permettant
potentiellement de faire passer des caractères illégaux.</para>
	      </listitem>
<listitem>
<para>On pourra consulter <ulink url="http://www.counterpane.com/crypto-gram-0007.html#9"><foreignphrase>Security
Risks of Unicode</foreignphrase></ulink>, bien qu'il soit
excessivement hostile, et la <ulink url="http://www.counterpane.com/crypto-gram-0008.html#9">discussion
qui a suivi</ulink>.</para>
	      </listitem>
	    </orderedlist></para>
	</section>
	  <section xmlns:xi="http://www.w3.org/2001/XInclude">
	    <title>Perl</title>
<para>Perl a un bon support d'Unicode. La version 5.8 ou supérieure
est recommandée pour Unicode. <command>man perlunicode</command> sur
un système où Perl est installé vous donnera plein d'informations. Une
bonne liste de diffusion est
<systemitem>perl-unicode@perl.org</systemitem>.
</para>
<para>Le classique livre de Christiansen et Torkington, &quot;Perl
Cookbook&quot;, aurait été refait dans sa deuxième édition pour exposer
toutes les arcanes de la prise en charge d'Unicode par Perl.</para>
	  </section>
	  <section xmlns:xi="http://www.w3.org/2001/XInclude">
	    <title>Python</title>
<para>Python a un bon support d'Unicode, qui s'est encore amélioré
dans la version 2.3. <xref linkend="lemburg.python"/> est un bon point de départ.</para>
	  </section>
	  <section xmlns:xi="http://www.w3.org/2001/XInclude">
	    <title>Java</title>
	    <para>Java n'utilise qu'Unicode depuis le début.</para>
	  </section>
	  <section xmlns:xi="http://www.w3.org/2001/XInclude">
	    <title>C</title>
<para>Pas de vrai support Unicode. Il existe des types de données
suffisamment grands pour stocker les caractères Unicode comme 
	  <type>wchar_t</type> mais sans sémantique associée. L'entrée
<foreignphrase>Character Set Handling</foreignphrase> de la
documentation de la GNU libc contient des indications à ce sujet.</para>
</section>
    </section>
  </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude" id="unicode-files"><title>Études de cas</title>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Noms de fichiers en Unicode</title>
<para>Pour une première étude de cas, imaginons qu'on veuille
permettre à un système Unix d'avoir des noms de fichier en Unicode,
comme le fait <link linkend="thompson.plan9-unicode">Plan9</link>. On
suppose que le noyau est <foreignphrase>8-bits
clean</foreignphrase><footnote><para>Un encodage d'Unicode sur 7 bits, UTF-7,
permet de gérer l'Unicode sur des systèmes archaïques mais il est très
peu utilisé.</para>
	</footnote>. Le problème peut sembler simple mais il ne l'est
pas. Il faut en effet définir des règles de normalisation pour éviter
d'avoir deux fichiers ayant le même nom affiché mais deux chaînes de
points de code différentes. Et il va falloir Unicodiser certaines
applications.</para>
<para>Pour normaliser, on peut s'appuyer sur <link linkend="RFC3454"><systemitem>stringprep</systemitem></link> et
définir un profil adapté aux noms de fichier. Le noyau sera alors
chargé de mettre les noms de fichier sous leur forme
canonique<footnote><para>Il est clair qu'un tel
<foreignphrase>patch</foreignphrase>, avec la taille des tables
Unicode et les problèmes de sécurité potentiels, ne va pas susciter l'enthousiasme
de beaucoup de développeurs Linux ou NetBSD...</para>
	</footnote>.</para>
<para>On va ensuite Unicodiser les applications. Prenons l'exemple de
ls. Cette application va devoir afficher des noms en Unicode. Il ne
faut évidemment pas mettre un moteur de rendu Unicode complet dans
chaque application : il faudra développer une bibliothèque que ls
pourra appeler.</para>
<para>ls doit également trier les fichiers par leur nom : il faudra
donc ajouter à ls l'algorithme de tri d'Unicode.</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude" id="idn"><title>Noms de domaine en Unicode (IDN)</title>
<para>Notre autre étude de cas portera sur un exemple réel. On le
sait, un nom comme
<computeroutput>www.maçonnerie-générale.fr</computeroutput> ne
serait pas légal. Ce qu'on sait moins, c'est que le problème ne vient
pas entièrement du <link linkend="RFC1035">DNS</link>, qui est <foreignphrase>8-bits
clean</foreignphrase> depuis toujours mais des <link linkend="RFC1123">règles de nommage des machines</link>, beaucoup plus
strictes, et qui n'acceptent que le US-ASCII<footnote><para>Plus exactement dans un sous-ensemble
d'US-ASCII, LDH, qui ne comporte que les lettres, les chiffres et le tiret.</para>
	      </footnote>.</para>
<para>Les noms de domaines internationalisés (IDN), visent à permettre
l'utilisation de noms en Unicode. IDN permet donc des noms
multi-écritures<footnote><para>Et pas multi-lingues, comme on le lit souvent.</para>
	</footnote>.</para>
<para>Pour cela, la norme, <xref linkend="RFC3490"/> spécifie :
    <orderedlist>
	  <listitem><para>Un principe : le DNS lui-même n'est pas
	  modifié. Aucun besoin de changer les serveurs DNS ou les
	  couches basses des résolveurs. Tout le travail doit être
	  fait dans les applications, d'où le nom officiel de cette
	  solution, IDNA (<foreignphrase>Internationalized Domain
	  Names in Applications</foreignphrase>).</para>
	  </listitem>
	  <listitem><para>Une normalisation, dite
	  <systemitem>nameprep</systemitem>, décrite en <xref linkend="RFC3491"/>, lui-même un profil de
	  <systemitem>stringprep</systemitem>, décrit en <xref linkend="RFC3454"/>.</para>
	    <para>Cette normalisation, commune à tous, permet de
	  comparer des noms de domaine afin de savoir si
	  <computeroutput>pi2.fr</computeroutput> est égal à 
	  <computeroutput>pi².fr</computeroutput>. Toute comparaison
	  d'IDN doit donc se faire après le passage par
	  <systemitem>nameprep</systemitem>, qui transforme un IDN en
	  un autre IDN, opération qui est irréversible puisque
	  plusieurs IDN ont la même forme normalisée.</para>
	  </listitem>
	  <listitem><para>Un encodage, qui est spécifique à IDN
	  <footnote>
<para>IDN est donc une des rares normes IETF à ne pas utiliser
UTF-8.</para></footnote>, <systemitem>punycode</systemitem>. Après le
passage par <systemitem>punycode</systemitem>, l'IDN est exprimé en
US-ASCII et peut passer par les bibliothèques existantes. Cet encodage
est réversible.</para>
</listitem>
	</orderedlist></para>
<para>Le déroulement complet de l'algorithme est le suivant (cet
algorithme est effectué par l'application, ou plutôt par la
bibliothèque IDN utilisée, pas par l'utilisateur).</para>
      <procedure>
	<step><para>Vous partez d'une chaîne Unicode, disons <systemitem>CAFÉ.fr</systemitem>.</para>
	</step>
<step><para>Vous la découpez en labels, ici
<systemitem>CAFÉ</systemitem> et <systemitem>fr</systemitem>.</para>
	</step>
<step><para>Vous passez les labels dans <link linkend="RFC3491"><systemitem>nameprep</systemitem></link>, ce qui
donne ici <systemitem>café</systemitem> et
<systemitem>fr</systemitem><footnote><para>En alphabet latin,
<systemitem>nameprep</systemitem> se contente en général de tout
mettre en minuscules mais dans d'autres écritures, sa tâche est plus complexe.</para>
	    </footnote>.</para>
	</step>
	<step><para>Vous passez les labels dans <link linkend="RFC3492"><systemitem>punycode</systemitem></link><footnote><para>Le
	      choix du préfixe xn--, qui permet de reconnaitre un IDN
encodé, sans ambiguïté, n'a pas été sans mal...</para>
	    </footnote>, ce qui
donne ici <systemitem>xn--caf-dma</systemitem> et
<systemitem>fr</systemitem><footnote>
<para>Les labels déjà en US-ASCII ne sont pas
affectés.</para></footnote>. Ce sont ces labels
<foreignphrase>punycodés</foreignphrase> qui seront mis dans le
fichier de zone du serveur DNS.
</para>
	</step>
      </procedure>
<para>Un algorithme analogue permet de traduire l'ACE
(<foreignphrase>ASCII Compatible Encoding</foreignphrase>) en un IDN Unicode.</para>
<para>Une application IDN, ici ping peut
alors fonctionner. ping étant un outil de déboguage, on a laissé voir
l'encodage <systemitem>punycode</systemitem>, l'ACE, ce que ne
ferait pas une application normale.
<programlisting>
<prompt>% </prompt>ping CAFÉ.eureg.org
PING CAFÉ.eureg.org (xn--caf-dma.eureg.org) (192.134.7.252) from 192.134.4.68 : ...
64 bytes from café.eureg.org: icmp_seq=1 ttl=254 time=0.775 ms
64 bytes from café.eureg.org: icmp_seq=2 ttl=254 time=0.359 ms
64 bytes from café.eureg.org: icmp_seq=3 ttl=254 time=0.342 ms

--- CAFÉ.eureg.org (xn--caf-dma.eureg.org.) ping statistics ---
3 packets transmitted, 3 received, 0% loss, time 2021ms
rtt min/avg/max/mdev = 0.342/0.492/0.775/0.200 ms
</programlisting></para>
<para>Il existe déjà plusieurs applications IDN comme Mozilla ou
mutt. De nombreuses bibliothèques en logiciel libre (comme <ulink url="http://josefsson.org/libidn/">GNU libidn</ulink>) existent pour les
programmeurs qui veulent IDNiser leurs applications.</para>
<para>Plusieurs registres ont commencé à enregistrer des IDN. Les
délais pour déployer cette technologie ne sont pas tous techniques
mais viennent aussi de la difficulté d'adapter les règles de droit au
nom ou bien les règles d'arbitrage en cas de conflit.</para>
</section>
  </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Questions non techniques</title>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Les organismes</title>
<para>Le <ulink url="unicode">consortium Unicode</ulink> est le
principal organisme pour le développement d'Unicode. Il édite la
norme, les rapports techniques (en général, très lisibles, comme les
RFC et contrairement aux normes ITU ou ISO), les fichiers de
données.</para>
<para>La licence est assez restrictive mais au moins tout est
disponible en ligne.</para>
<para>Il existe également un comité ISO, le 10646, qui ne semble pas
avoir d'autres activités que de mettre un tampon ISO sur les documents
Unicode.<footnote>
<para>Autrefois, Unicode et UCS - le nom officiel de la norme ISO -
étaient deux normes différentes. Ce sont aujourd'hui la même.</para></footnote>
</para>
    </section>
<section xmlns:xi="http://www.w3.org/2001/XInclude"><title>Déploiement d'Unicode</title>
<para>Comme pour d'autres technologies, la seule supériorité technique
ne suffira pas à faire passer tout le monde à Unicode dans la
journée. Le processus de transition promet de ne pas être
instantané.<!-- Cf. catastrophe avec RedHat 9 --></para>
<para>Plusieurs acteurs vont en effet devoir agir :
  <itemizedlist>
	  <listitem><para>Les auteurs de norme vont devoir intégrer
	  Unicode : pour les normes IETF (<xref linkend="RFC2277"/> et
	  <xref linkend="RFC3536"/>) ou W3C (<xref linkend="w3c.charmodel"/>), c'est déjà largement réalisé.</para>
	  </listitem>
	  <listitem><para>Les programmeurs vont devoir écrire des
	  programmes Unicode. C'est beaucoup plus simple dans un
	  langage de haut niveau comme Python mais cela va nécessiter
	  des changements.</para> 
	    <para>Il faudra aussi se débarasser d'habitudes
	  mentales très ancrées comme l'égalité un caractère = un octet.</para>
	  </listitem>
	  <listitem><para>Les administrateurs système vont devoir
	  donner la préférence aux programmes qui prennent déjà en
	  charge Unicode. Si Unicode est une option de compilation,
	  ils vont devoir penser à l'activer.</para>
	  </listitem>
	  <listitem><para>Et les utilisateurs vont devoir houspiller
	  tout le monde pour avoir Unicode :-)</para>
	  </listitem>
	</itemizedlist></para>
<para>Une transition très longue est donc à prévoir, pendant laquelle
il faudra accepter la coexistence d'Unicode avec d'autres jeux de caractères.</para>
</section>
  </section>
<bibliography><biblioentry id="unicode.glossary">
    <author><surname>Unicode consortium</surname>
    
    </author>
    
    
  
    <title>Unicode Glossary</title>
    
  
    <date>?</date>
    
    
  
    <abstract><para><ulink url="http://www.unicode.org/glossary/">http://www.unicode.org/glossary/</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="unicode.utr10">
    <author><surname>Unicode consortium</surname>
    
    </author>
    
    
  
    <title>UTR #10 - Unicode Collation Algorithm</title>
    
  
    <date>2002</date>
    
    
  
    
  
    <abstract><para><ulink url="http://www.unicode.org/reports/tr10/">http://www.unicode.org/reports/tr10/</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="unicode.utr15">
    <author><surname>Unicode consortium</surname>
    
    </author>
    
    
  
    <title>UTR #15 - Unicode Normalization Forms</title>
    
  
    <date>2003</date>
    
    
  
    
  
    <abstract><para><ulink url="http://www.unicode.org/reports/tr15/">http://www.unicode.org/reports/tr15/</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="unicode.utr17">
    <author><surname>Unicode consortium</surname>
    
    </author>
    
    
  
    <title>UTR #17 - Character encoding model</title>
    
  
    <date>2000</date>
    
    
  
    
  
    <abstract><para><ulink url="http://www.unicode.org/reports/tr17/">http://www.unicode.org/reports/tr17/</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="unicode.utr18">
    <author><surname>Unicode consortium</surname>
    
    </author>
    
    
  
    <title>UTR #18 - Unicode Regular Expression Guidelines</title>
    
  
    <date>2002</date>
    
    
  
    
  
    <abstract><para><ulink url="http://www.unicode.org/reports/tr18/">http://www.unicode.org/reports/tr18/</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="andre.latin1">
    <author><firstname>Jacques</firstname>
    
    <surname>André</surname>
    
    </author>
    
    
  
    <title>ISO Latin-1, norme de codage des
caractères européens?</title>
    
  
    <date>1996</date>
    
    
  
    
  
    
  
    
  
<abstract><para><ulink url="http://www.gutenberg.eu.org/pub/GUTenberg/publicationsPDF/25-andre.pdf">http://www.gutenberg.eu.org/pub/GUTenberg/publicationsPDF/25-andre.pdf</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="thompson.plan9-unicode">
    <author><firstname>Rob</firstname>
    
    <surname>Pike</surname>
    
    </author>
    
    
  
    <author><firstname>Ken</firstname>
    
    <surname>Thompson</surname>
    
    </author>
    
    
  
    <title>Hello World, </title>
    
  
    <date>1993</date>
    
    
  
    
  
    
  
    
  
    <abstract><para><ulink url="http://www.cs.bell-labs.com/sys/doc/utf.html">http://www.cs.bell-labs.com/sys/doc/utf.html</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="unicode-debian">
    <author><firstname>Radovan</firstname>
    
    <surname>Garabìk</surname>
    
    </author>
    
    
  
    <title>Step by step introduction to switching your debian
    installation to utf-8 encoding</title>
    
  
    <date>2001</date>
    
    
  
    <abstract><para><ulink url="http://melkor.dnp.fmph.uniba.sk/~garabik/debian-utf8/howto.html">http://melkor.dnp.fmph.uniba.sk/~garabik/debian-utf8/howto.html</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="unicode-howto">
    <author><firstname>Bruno</firstname>
    
    <surname>Haible</surname>
    
    </author>
    
    
  
    <title>The Unicode HOWTO</title>
    
  
    <date>?</date>
    
    
  
    <abstract><para><ulink url="http://www.linux.org/docs/ldp/howto/Unicode-HOWTO.html">http://www.linux.org/docs/ldp/howto/Unicode-HOWTO.html</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="gillam.unicode">
    <author><firstname>Richard</firstname>
    
    <surname>Gillam</surname>
    
    </author>
    
    
  
    <title>Unicode demystified</title>
    
  
    <date>2003</date>
    
    
  
    
  
    <publisher><publishername>Addison-Wesley</publishername>
    
    </publisher>
    
    
  
  </biblioentry>
    <biblioentry id="lemburg.python">
    <author><firstname>Marc-André</firstname>
    
    <surname>Lemburg</surname>
    
    </author>
    
    
  
    <title>Python and Unicode</title>
    
  
    <date>2002</date>
    
    
  
    <abstract><para><ulink url="http://www.egenix.com/files/python/Unicode-EPC2002-Talk.pdf">http://www.egenix.com/files/python/Unicode-EPC2002-Talk.pdf</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="unicode.français">
    <author><surname>Hapax</surname>
    
    </author>
    
    
  
    <title>Unicode 3.1 et ISO 10646 en français</title>
    
  
    <date>?</date>
    
    
  
    <abstract><para><ulink url=" http://pages.infinit.net/hapax/"> http://pages.infinit.net/hapax/</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="w3c.charmodel">
    <author><surname>World-Wide Web consortium</surname>
    
    </author>
    
    
  
    <title>Character Model for the World Wide Web</title>
    
  
    <date>2003</date>
    
    
  
    <abstract><para><ulink url="http://www.w3.org/TR/charmod/">http://www.w3.org/TR/charmod/</ulink>
    
    </para>
    
    </abstract>
    
    
  
  </biblioentry>
    <biblioentry id="RFC1035"><author><firstname>P.</firstname>
    
    <surname>Mockapetris</surname>
    
    </author>
    
    
      
<title>RFC 1035: Domain names - implementation and specification</title>
    
      
<date>1987</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC1123"><author><firstname>R.</firstname>
    
    <surname>Braden</surname>
    
    </author>
    
    
      
<title>RFC 1123: Requirements for Internet Hosts - Application and Support</title>
    
      
<date>1989</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC2045"><author><firstname>N.</firstname>
    
    <surname>Freed</surname>
    
    </author>
    
    
      <author><firstname>N.S.</firstname>
    
    <surname>Borenstein</surname>
    
    </author>
    
    
      
<title>RFC 2045: Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title>
    
      
<date>1996</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC2277"><author><firstname>H.T.</firstname>
    
    <surname>Alvestrand</surname>
    
    </author>
    
    
      
<title>RFC 2277: IETF Policy on Character Sets and Languages</title>
    
      
<date>1998</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC2279"><author><firstname>F.</firstname>
    
    <surname>Yergeau</surname>
    
    </author>
    
    
      
<title>RFC 2279: UTF-8, a transformation format of ISO 10646</title>
    
      
<date>1998</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC3454"><author><firstname>P.</firstname>
    
    <surname>Hoffman</surname>
    
    </author>
    
    
      <author><firstname>M.</firstname>
    
    <surname>Blanchet</surname>
    
    </author>
    
    
      
<title>RFC 3454: Preparation of Internationalized Strings (&quot;stringprep&quot;)</title>
    
      
<date>2002</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC3490"><author><firstname>P.</firstname>
    
    <surname>Faltstrom</surname>
    
    </author>
    
    
      <author><firstname>P.</firstname>
    
    <surname>Hoffman</surname>
    
    </author>
    
    
      <author><firstname>A.</firstname>
    
    <surname>Costello</surname>
    
    </author>
    
    
      
<title>RFC 3490: Internationalizing Domain Names in Applications (IDNA)</title>
    
      
<date>2003</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC3491"><author><firstname>P.</firstname>
    
    <surname>Hoffman</surname>
    
    </author>
    
    
      <author><firstname>M.</firstname>
    
    <surname>Blanchet</surname>
    
    </author>
    
    
      
<title>RFC 3491: Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN)</title>
    
      
<date>2003</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC3492"><author><firstname>A.</firstname>
    
    <surname>Costello</surname>
    
    </author>
    
    
      
<title>RFC 3492: Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)</title>
    
      
<date>2003</date>
    
    
      
      
</biblioentry>
    <biblioentry id="RFC3536"><author><firstname>P.</firstname>
    
    <surname>Hoffman</surname>
    
    </author>
    
    
      
<title>RFC 3536: Terminology Used in Internationalization in the IETF</title>
    
      
<date>2003</date>
    
    
      
      
</biblioentry>
    </bibliography>
</article>
<!-- Pour Emacs
Local Variables: 
 default-input-method:TeX
End: 
-->
