====== Dans le HTML ====== ==== Les pieds dans la toile ==== Bien que pour HTTP, protocole apte à transmettre des flux d'octets sans considérer que ce sont forcément des caractères, bon nombre de problèmes sont à résoudre. Le langage HTML (Hyper Text Markup Language), lui aussi, propose des méthodes particulières pour traiter les caractères non US-ASCII. Il règne d'ailleurs dans ce domaine la plus grande confusion. Avec la version 3.2 du HTML, il n'y avait normalement pas d'autre possibilité que de passer par un transcodage du type « signes nommés ». Depuis le version 4.0 de HTML, il est théoriquement possible de définir dans l'en-tête du document quel jeu de caractères est utilisé. Comme HTML est probablement le lieu où les normes sont le moins respectées, il convient tout de même de rester prudent. Car, croyez-vous que le fait de pouvoir utiliser UTF-8, ISO-8859-1, ISO-8859-15 ou autre, simplement en annonçant la chose dans l'en-tête HTML ? Voyons ceci... Dans la page que nous avons sous les yeux, il est écrit :
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   ...
</head>
En voyant ceci, notre « browser » va comprendre qu'il faut utiliser UTF-8 et, normalement, il n'y a pas de problème, à la condition bien entendu que le texte qui a été introduit dans ce wiki soit bien encodé en UTF-8. Mais en cas de désaccord entre la saisie et l'affichage, la phrase : Nous avons été abusés par le système Pourrait devenir ceci : Nous avons été abusés par le système Nettement moins lisible n'est-ce pas ? Dans cet exemple, le texte a été encodé en UTF-8 et décodé en ISO-8859-1. Il s'agit bien sûr d'une manipulation pour faire apparaitre ceci. Mais forcez donc votre navigateur à afficher cette page en ISO-8859-1... Normalement, avec des choses comme les WIKI, le problème ne se rencontre pas, sauf dans certains cas tordus... Si nous utilisons les « signes nommés », nous pouvons garantir plus d'interopérabilité, au prix d'un code source HTML nettement moins lisible. === Les signes nommés === Le principe est simple : * Un caractère d'échappement : Le **&**, * un nom pour le caractère non US-ASCII * un délimiteur de fin de codage : le **;** Un simple exemple, juste pour illustrer. Le **é** devrait se coder dans le source HTML : **&;eacute;** Vous trouverez beaucoup plus de détails sur les signes nommés ainsi que sur beaucoup d'autres points du HTML sur le très instructif site [[http://fr.selfhtml.org/|SELFHTML]]. Il existe une table de signes nommés définie dans HTML 3.2 . HTML 4.0 définit des ajouts à cette table, bien que, théoriquement, une balise d'en-tête du type : devrait à elle seule permettre l'emploi de tous les symboles définis par iso-8859-1 (version 4.0 uniquement). === Une manipulation amusante === FrontPage 2000, (un éditeur HTML de Microsoft), ne s'embarrassait pas de considérations complexes, annonçait un ''charset=windows-1252'' dans ses en-têtes et ne code aucun de ces symboles de façon particulière, même pas l'euro. D'autres éditeurs, comme DreamWeaver (de Macromedia) ou Golive (d'Adobe) sont plus orthodoxes et, non seulement annonceront un « charset=iso-8869-1 », mais encore utiliseront les signes nommés pour les caractères non US. L'exemple qui suit est « bricolé » directement dans le source HTML. La même ligne sera codée selon diverses façons : | Caractères | codage | | | é è ç ù à ê € | é è ç ù à ê € (sans codage) | FrontPage 2000 | | é è ç ù à ê € | ''é è ç ù à ê €'' | DreamWeaver 4 | | é è ç ù à ê € | ''é è ç ù à ê €'' | Golive 5 | Normalement, il y a de grandes chances que vous voyez tout ça correctement. Maintenant, si vous utilisez Internet Explorer, allez dans « Affichage », puis « Codage » et changez le codage par défaut. Là, vous risquez de voir les limites de FrontPage qui n'utilise pas systématiquement les signes nommés, même si en théorie, HTML 4.0 devrait le permettre. Ceux qui n'utilisent pas IE doivent avoir quelque part une fonction équivalente, pour changer l'affichage par défaut. Notez la curieuse façon de coder le symbole de l'euro par Golive 5 : **€** . C'est tout simplement sa valeur numérique, en hexadécimal, dans la normalisation unicode... === Que penser de tout ça ? === Il serait possible de pousser encore plus loin les investigations, et de supprimer dans l'en-tête de chaque page la définition du « charset » , ça ne changerait très probablement rien au résultat final. Vous le voyez, nous sommes ici dans le flou « artistique ». Au bout du compte, même en HTML 4.0, il semble de bon ton d'utiliser tout de même systématiquement les signes nommés, même si l'on peut s'en passer le plus souvent ===== Conclusions ===== Si vous n'avez pas encore attrapé le vertige, vous ne l'attraperez plus. Sinon, essayons de consolider un peu nos positions. ==== Les faits ==== * Les systèmes numériques ne savent traiter que des informations binaires, donc numériques. * Les protocoles applicatifs, le plus souvent, ont besoin de transporter du texte. * Le texte est destiné à être lu, donc écrit, et  n'est pas constitué d'une collection de valeurs numériques, mais d'une collection de symboles graphiques : Un alphabet * Il n'y a pas qu'un seul alphabet au monde. * Les protocoles applicatifs peuvent avoir aussi à échanger des données qui ne sont pas du texte (une image, du son, une vidéo...). ==== Les solutions ==== * Coder sur 7 bits un jeu de caractères minimal (US-ASCII), mais il n'y a pas que l'américain dans le monde, et 128 valeurs ne suffisent pas pour des langues riches en lettres accentuées. * Coder sur 8 bits, mais ça ne suffit pas non plus pour toutes les langues possibles. * Coder en UTF-8. ==== Le bricolage ==== Le « bricolage » le plus propre consiste à utiliser un jeu de caractères minimal et de coder les caractères supplémentaires par une combinaison identifiable des caractères de base. C'est cette solution qui est le plus souvent mise en œuvre, et elle donne finalement les meilleurs résultats. * Codage « quoted-printable » (e-mails, imprimantes...) * Codage « Base64 » (e-mails, fichiers pouvant contenir autre chose que du texte pur...) * Signes nommés (HTML). Vous trouverez par exemple [[http://actuel.fr.selfhtml.org/archives/docu/7.0/the.htm|ici]] la liste des signes nommés utilisables en HTML 3.2 et en HTML 4. De même, à la source sur le [[http://www.w3.org/MarkUp/Guide/Advanced.html|site du W3C]].