Site multilingue et encodage des caractères

Publié le 20 novembre 2012 - Developpement Web. Tags : ,

Petit break dans la mise à jour de l’encodage d’un site international, j’en profite donc pour vous expliquer comment développer proprement ce genre de site.

Si la norme ISO-8859-1 peut faire l’affaire si vous développez un site qui sera uniquement disponible dans la langue de Molière, il vous faudra impérativement penser UTF-8 si vous songez à manipuler une autre langue. La raison est simple : selon les langues, il existe une multitude de caractères spéciaux; et pour afficher correctement ces caractères étrangers (et éviter ainsi les hiéroglyphes résultant d’un problème d’encodage), une seule norme convient : l’UTF-8.

On rencontre encore trop souvent des sites mal encodés, alors que ce paramètre est relativement simple à mettre en place : il suffit d’y penser lors du développement du site en suivant quelques règles basiques que voici.

Déclaration de l’encodage de la page

La déclaration de l’encodage d’une page HTML se fait grâce à la balise meta chartset, placée juste après l’ouverture du <head> (avant tout texte en somme, y compris celui du <title>):

<meta charset="utf-8">

Encodage du fichier

L’erreur traditionnelle pouvant résulter en une prise de tête sans nom, c’est oublier le paramètre concernant l’encodage du fichier à proprement parler. Celui-ci doit impérativement être encodé en UTF-8 sans BOM pour être compatible.  Si vous utilisez notepad++, direction le menu « encodage », option « encoder en utf8 (sans BOM) ».

A l’affichage

Pour afficher correctement du texte en UTF-8 tout en protégeant vos variables en sortie, vous devez faire appel à la fonction htmlentities() (en PHP), soit quelque chose du style :

$text = "éàë";
echo htmlentities($text , ENT_QUOTES, "UTF-8");

Dans la base de données

Si vous suivez toutes les indications précédentes, mais que votre contenu provient d’un champ d’une table MySQL mal encodé, vous obtiendrez également des signes incompréhensibles. Pensez donc à encoder les champs contenant du texte en spécifiant comme interclassement « utf8_unicode_ci ».

Voilà, ce n’est pas bien compliqué, et je vous conseille même de toujours penser à l’UFT8 pour peu que votre site soit un minimum complexe, même si vous devez développer un site Français. D’une part parce que l’on sait jamais de quoi demain sera fait (une site devenant multilingue…), mais aussi par parce que ce n’est pas plus compliqué que ISO-8859-1, et largement plus portable.  Le seule vraie raison pour laquelle l’ISO-8859-1 reste plus intéressant que l’UTF-8 concerne les sites en HTML pur, avec du texte en dur directement dans le cœur des pages.

En complément

Que ce soit au sein d’une base de données ou via un flux XML, il est fréquent de devoir manipuler des données mélangeant caractères ISO et UTF-8. Pour nettoyer les données de ce type, voici une excellente classe PHP. Pour convertir un texte en UTF-8, il vous suffira de procéder de la sorte :

$utf8_string = Encoding::toUTF8($string);

Cela aura pour effet de convertir les caractères ISO 8859-1, mais de conserver les caractères déjà en UTF-8 (d’où la différence avec la fonction native utf8_encode()). Notez qu’il est possible de produire l’effet inverse en remplaçant la méthode toUTF8 par toLatin1. En bonus (et quel bonus!), il est possible de corriger une chaine de caractères qui serait passée plusieurs fois à la moulinette (du style utf8_encode()….) grâce à fixUTF8.

Si votre encodage concerne un champ MySql, n’oubliez pas que vous pouvez rechercher / remplacer en MySQL (attention: l’exemple lié permet de passer de UTF-8 à un encodage latin).

Enfin, si vous voulez détecter les champs ayant des caractères spéciaux dans des enregistrements MySQL, vous pouvez utiliser cette requête :

SELECT * FROM table WHERE LENGTH( column ) != CHAR_LENGTH( column )

Articles sur ce thème :