Utiliser des caractères UNICODE dans une page en ISO latin

L’entête d’une page HTML permet de préciser son charset, par exemple :

<meta http-equiv="Content-Type" content="text/html;charset=ISO8859-1" >

permet de préciser que le contenu d’une page HTML, est codé en utilisant le répertoire de caractères ISO8859-1.

Ce répertoire, limité à 256 caractères, ne comporte pas plusieurs caractères qui font pourtant partie des caractères français :

Les « o e collés » majuscules "Œ" (code unicode U+0152) et minuscule "œ" (code unicode U+0153) et le ÿ majuscule (code unicode U+0178).

Le caractère euro € est maintenant rentré dans les mœurs et est même disponible directement sur un clavier windows français. Le « oe collés » est indispensable à l’écriture de mots comme : bœuf, chœur, cœur, manœuvre, mœurs, œil, œillet, œuf, œuvre, sœur, vœu,  cœlacanthe…

Quant au ÿ, il est plus rare mais présent par exemple dans des noms propres comme la Haÿ les roses.

N’hésitez pas à lire http://www.gutenberg.eu.org/pub/GUTenberg/publicationsPDF/25-andre.pdf pour plus de détails sur ce point.

Ces caractères n’étant pas supportés par ISO8859-1, soit on change le charset (pour par exemple passer en UTF-8 ou en ISO8859-15), soit on utilise un échappement. Cette dernière solution a le mérite d’être indépendante du charset utilisé pour la page.

Pour escaper les « o e collés » dans le texte HTML, la première solution est d’utiliser les entités nommés &oelig; et &OElig; ce qui donne par exemple (pour le titre d’une page HTML) :

<title>La vie trépidante du c&oelig;lacanthe</title>

On peut aussi utiliser les entités numériques décimale HTML ; ainsi :

<title>La vie trépidante du c&#339;lacanthe</title>

est aussi parfaitement valide (339 étant le code décimal correspond à 153 en hexadécimal), ou pour rester en hexadécimal :

<title>La vie trépidante du c&#x153;lacanthe</title>

Il se trouve que Windows autorise aussi (mais cette une mauvaise pratique puisqu’elle n’assure pas que le caractère sera correctement interprété sur toutes les plateformes) l’entité &#156; qui correspond au codage Windows-1252 et au raccourcis clavier Windows pour obtenir le caractère (Alt+0156).

En ce qui concerne le code javascript, les mêmes précautions sont aussi valables. Elles devraient même être étendues à tous les caractères non ASCII, parce qu’il suffit d’éditer un fichier javascript avec un éditeur non ASCII, ou supportant un autre charset que celui utilisé initialement pour avoir des problèmes.

Ainsi,

<SCRIPT>
var a="cœlacanthe" ;
alert("a : "+a) ;
</SCRIPT >

Ne fonctionnerait pas correctement avec une page dont le charset est en ISO8859-1. Il existe la possibilité de préciser un charset pour la balise SCRIPT, lorsqu’on utilise un fichier externe, ce qui donne par exemple :

<script type="text/javascript" src="monscript.js" charset="UTF-8"></script>

mais cela ne résout pas le problème des scripts inline et reste dangereux (le charset du fichier étant précisé dans la page qui l’utilise, pas par le fichier lui-même).

En fait, dans l’exemple précédent, la longueur même de la chaîne est fausse avec une page au charset en ISO8859-1 (elle fait 11 caractères dans ce cas, alors qu’elle ne devrait en comporter que 10).

Il faut donc utiliser la forme uxxxxxxxx est le code hexadécimal unicode du caractère. Cet échappement javascript fonctionne de la même façon qu’en java. Ainsi, la forme suivante fonctionne correctement, quel que soit le charset de la page :

<SCRIPT>
var a="cu0153lacanthe" ;
alert("a : "+a) ;
</SCRIPT >

Attention, la chaîne a comporte bien 10 caractères (l’échappement UNICODE correspond toujours à un seul caractère).

Notons que comme en java, le caractère produit par un échappement UNICODE ne participe pas à d'éventuels autres échappements. Par exemple,

u005cu005a donne les 6 caractères u 0 0 5 a même si l’échappement  u005C donne le caractère "".

Pour le caractère euro, le code UNICODE est U+20AC, en HTML, on peut donc utiliser les entités &euro; &#x20AC;ou &#8364; (là aussi, il est très déconseillé d’utiliser le codage Windows-1252 : &#128;).

En javascript, on utilisera donc u20AC.

Noter que même pour une page dont le charset est à ISO8859-1, il est possible, via javascript, d’insérer dynamiquement dans la page des caractères unicodes non couverts par ISO8859-1.

Le charset de la page permet d'indiquer au navigateur comment interpréter les octets du fichier qu'il doit afficher mais n'implique pas une limitation de ce qu'on peut rajouter dynamiquement via javascript.

Ainsi, le code suivant est parfaitement valide, quel que soit le charset de la page :

<DIV id="destination"></DIV>
<SCRIPT>
var a="cu0153lacanthe" ;
document.getElementById("destination").innerHTML=a ;
</SCRIPT>

On peut donc, via AJAX, insérer des chaînes comportant des caractères UNICODE dans une page quel que soit son charset (par contre, le navigateur peut ou pas comporter la fonte capable d’afficher ce caractère, il suffit d’essayer la page http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt pour voir qu’il reste des progrès à faire dans ce domaine).

En ce qui concerne l’utilisation de JSON, la norme (http://www.ietf.org/rfc/rfc4627.txt) précise bien que le support d’UNICODE est obligatoire. Javascript doit donc permettre de communiquer en JSON avec des caractères UNICODE :

JSON text SHALL be encoded in Unicode. The default encoding is UTF-8.

JSON peut donc aussi être représenté en utilisant de l’UTF-16 ou UTF-32 mais le codage par défaut est UTF-8.

Rappelons qu’UTF-8 est un codage à longueur variable (de 1 à 4 octets pour encoder 1 caractère), donc, toute erreur de charset (par exemple interpréter une chaine UTF-8 en ISO8859-1) se traduit par l’affichage de caractères excédentaires.

Par exemple, le caractère euro de code UNICODE U+20AC s’exprime en UTF-8 sous forme de 3 octets : E2 82 AC

En UTF-8, seuls les caractères ASCII (code inférieur à 127) s’expriment avec un seul octet, les caractères entre 128 et 255 s'expriment sur 2 octets (entre C2 80 et C3 BF). Du coup, lorsqu'il y a une erreur de charset, les caractères ISO8859-1 non ascii sont mal affichés. Par exemple, l'apparition de séquences de 2 caractères à la place d'un seul (par exemple pour le "é") est un signe indubitable d'une page contenant de l'UTF-8 affichée en ISO8859-1.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.