Code - Clé - EncodageDrôle de découverte…

Alors que je déplaçais un site vers un serveur flambant neuf (le précédent serveur ayant rendu de bons et loyaux services), nouveau serveur absolument up-to-date en termes de configuration, je me retrouve avec un soucis de caractères accentués mal affichés (en l’occurrence des ? en lieu et place des caractères accentués n’ayant pas été remplacés par les entités HTML correspondantes).

Sur l’ancien serveur, aucun soucis, sur mon serveur local de test non plus, mais sur le serveur de production, ces caractères sont mal affichés. Pour ajouter à mon trouble, seulement les caractères en dur dans le fichier servi, et pas ceux des textes issus de la base de données.

Premiers réflexes : je vérifie que mon fichier est bien enregistré dans le bon format, dans le cas présent en ANSI dans mon éditeur habituel, qu’il déclare bien le bon encodage, avec le bon charset, dans le header de ma page :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
C’est le cas.

Je vérifie la réponse du serveur à une requête GET sur ce fichier :
Content-Type:text/html; charset=UTF-8
Argh !!!

Je vérifie que le fichier s’est bien transféré vers le serveur, sans corruption possible.

Aucune raison que ce fichier soit servi en utf-8 puisque tout indique qu’il est encodé en iso-8859-1.

Je fais des recherches sur Internet :
Ajouter
AddDefaultCharset ISO-8859
à la configuration du serveur Apache semble la solution indiquée par beaucoup (avec quelques autres variantes).
Je teste, mais dans mon cas, elle ne marche pas (ce qui me semble logique, cet encodage de caractères en iso-8859-1 étant bien déclaré sur le serveur Apache)…

Il m’a fallu un bon moment pour découvrir que les dernières versions de PHP servent de l’utf-8 par défaut (c’est récent) et que mon document, même balisé pour un encodage en iso-8859-1 était servi en utf-8 au navigateur qui en perdait son latin.

Une simple modification du php.ini ou une surcharge du paramètre suffit :

default_encoding = "utf-8"
vs
default_encoding = "iso-8859-1"

Bon code !