Problème d'encodage sur les sites web suite à la migration Etch

cf CR migration hebergeur et tests sur osti pour l'historique.

Je (NM) recopie ici le bilan fait par ProgFou et posté sur la liste tech.

Contexte

"[Je publie ce compte-rendu d'étude sur Tech@Auf dans l'intérêt général de notre communauté technique. Contexte : problème de caractères mal encodés sur les sites web hébergés à Montréal, suite a la migration vers Debian Etch des serveurs.]" -- ProgFou

Bon... Finalement ça devrait se passer beaucoup mieux que prévu ! :-)

Premières observations

Moussa NOMBRE a écrit :

Suite à ces remarques de Moussa, qui révèlent une situation plus qu'étrange, j'ai décidé d'aller faire un tour sur intranet.auf et osti.auf pour en avoir le cœur net.

Confirmations des observations

Premières hypothèses

Dernière hypothèse

La dernière hypothèse qui m'est alors venue est celle d'une différence au niveau de la librairie libmysqlclient avec laquelle le module MySQL de PHP est lié. Je me suis dit que la libmysqlclient 4.0 devait prendre le jeu de caractères proposé par le serveur MySQL (UTF-8) alors que la libmysqlclient 5.0 devait prendre celui proposé par le client (ici PHP, donc ISO-8859-1).

Vérification de l'hypothèse finale

Afin de vérifier cette hypothèse, il me fallait modifier le jeu de caractères du côté serveur MySQL pour voir si les réponses en seraient aussitôt différentes, ce qui n'était évidement pas faisable directement sur le serveur db.auf (en production !). Moussa m'a proposé, merci a lui, de faire des tests sur db-secours, qui est une copie exacte de db.auf. C'était exactement ce qu'il me fallait car cela m'a permis de vérifier mon hypothèse qui s'est révélée exacte !

En changeant l'option "default-character-set" du côté serveur, cela provoque immédiatement un changement de comportement pour les clients liés a la librairie libmysqlclient 4.0 ! En particulier, mettre default-character-set = latin1 côté serveur donne immédiatement une connexion 100% ISO-8859-1 depuis intranet et osti.

Explications

Mon explication est que la librairie MySQL 4.0 avait un support Unicode bogué qui ne tenait pas compte du jeu de caractères du client et prenait à la place celui par défaut du côté serveur. Alors que la librairie MySQL 5.0 supporte officiellement Unicode et corrige ce bogue en tenant compte du choix de jeu de caractères côté client.

Le truc amusant est que ce bogue nous a facilité les choses dans le sens qu'il nous a évité d'avoir à configurer le bon jeu de caractères du côté client. Mais c'est à double tranchant puisque du coup nos scripts ne spécifient pas le jeu de caractères voulu ! Et la migration Etch qui nous apporte la librairie MySQL 5.0 nous révèle alors ce défaut.

Bilan

Conclusion