Ces maudits accents !

De www.lalitte.com.

Sommaire

La gestion des accents sur votre site web

Si vous gérez un site web, il vous est peut-être arrivé d'héberger des pages en français et de vous retrouver avec une gestion des accents assez folklorique. Des losanges avec point d'interrogation aux chaînes de caractères les plus originales, cette problématique des accents est souvent rencontrée quand on héberge des sites, et surtout quand on les migre d'une machine à une autres où les configurations logicielles peuvent être différentes.

C'est quoi le problème ?

En fait, compte tenu de la diversité des caractères utilisés à travers le monde (accents en français, caractères chinois, japonais, arabes, hébreux, etc.) il est possible d'encoder les informations textuelles sous diverses formes afin de prendre en compte ces accents. De nos jours, l'encodage UTF-8 est souvent privilégié car il prend bien en compte toute une catégorie de caractères spéciaux de manière universelle. Il représente aujourd'hui 90% des pages présentées sur Internet. Cependant, des encodages spécifiques à chaque langue peuvent être utilisés, comme l'ISO-8859-1 qui prend en compte l'écriture des caractères latins que nous utilisons. S'il y a une incohérence entre le codage de vos fichiers et ce que votre serveur présente aux navigateurs qui l'interrogent, c'est le drame et les accents ou caractères spéciaux viendront piétiner votre si beau texte.

Un peu de détails

Je ne suis pas un spécialiste du sujet, mais à force d'avoir été plusieurs fois confronté au problème, et en mettant souvent beaucoup de temps à le résoudre, je vous propose les quelques réflexions que j'ai pu avoir sur le sujet.

Liste des sources d'encodage ou de présentation possibles

Voici une petite liste non exhaustive des différentes sources qui peuvent poser problème dans le cadre d'un affichage incorrect des accents, dans le cadre d'un site PHP utilisant une base mysql:

  • L'encodage de la base de données
  • L'encodage des fichiers HTML ou PHP
  • Le charset présenté par le site web
  • Le charset présenté par PHP

Selon votre configuration, il est possible que vous ayez d'autres sources d'encodage.

La solution ?

L'idée générale est d'avoir une cohérence entre chacun de ces éléments. Si vous avez des fichiers encodés au niveau de votre système en ISO-8859-1 et que votre site présente vos pages en UTF-8, cela ne va pas fonctionner car les accents seront encodés dans un codage différent que celui utilisé pour les présenter. Maintenant, sachant cela, il n'est pas toujours facile de débugger un problème d'encodage, car il faut d'une part penser à tout, et d'autre part certaines directives peuvent être prioritaires par rapport à d'autres.

Un cas d'école

J'ai voulu migrer un site d'un ancien serveur vers un serveur plus récent. Le site semblait être encodé en ISO-8859-1. J'ai bien fait attention d'utiliser les mêmes outils et les mêmes fichiers de configuration pour ne pas tout chambouler, et pourtant, patatra, le problème des accents est apparu lors de la migration, avec le beau résultat suivant :
Fichier:Capture_avec_losange.png
J'ai donc testé chacune des étapes précédentes.

Encodage de la base :

Avec la bonne requête SQL
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'nom_base';
Fichier:encodage_sql.png
On est en latin1, ce qui correspond à ISO-8859-1

Encodage des fichiers :

On teste sur le système de fichiers linux
root@webItinet:~/cours# file -i mainlayout.php
mainlayout.php: text/html; charset=iso-8859-1
On est encore bien en ISO-8859-1

Encodage des pages web :

Mon site tourne sous apache2 avec un virtualhost particulier qui contient bien la directive
AddDefaultCharset ISO-8859-1
On est encore bien en ISO-8859-1

Et pourtant !

Là je me suis dit, on est bien, tout va bien.
Et pourtant les vilains losanges sont toujours là !
En utilisant les outils de développement qui permette de voir l'en-tête HTTP reçu par le navigateur, l'erreur est sans appel
Fichier:encodage_HTTP.png
l'encodage UTF-8 est encore bien présent.

La solution !

Après maintes recherches sur Internet, un collègue qui s'est intéressé au problème m'indique de regarder du côté de PHP.
Je modifie dans le php.ini le charset qui était par défaut en UTF-8, et là plus de losanges !
Pour faire plus propre, je remets le php.ini comme il était, et j'ajoute dans mon fichier de base index.php une ligne indiquant le charset à utiliser. Ca évitera aux autres sites hébergés sur la machine de perdre leurs accents à leur tour.
header('Content-Type: text/html; charset=iso-8859-1');
Et hop ! mon site a bien récupéré ses accents.
Fichier:Accents_corrects.png
Si cela peut vous éviter quelques heures de débuggage, j'en serai content !