Il s'agit d'un problème de jeu de caractères. En tant que tel, il peut y avoir un problème à différents niveaux, mais le plus probable est que les chaînes de votre base de données sont encodées en utf-8 et que vous les présentez en iso-8859-1. Ou l'inverse.
La meilleure façon de résoudre ce problème est de mettre de l'ordre dans les jeux de caractères. La stratégie la plus simple, puisque vous utilisez PHP, est d'utiliser iso-8859-1 dans toute votre application. Pour ce faire, vous devez vous assurer que
- Tous les fichiers sources de PHP sont sauvegardés en iso-8859-1 (à ne pas confondre avec cp-1252).
- Votre serveur web est configuré pour servir des fichiers avec l'extension
charset=iso-8859-1
- Vous pouvez également modifier les paramètres du serveur Web à partir du document PHP, en utilisant la commande suivante
header
.
- En outre, vous peut insérer une balise méta dans votre HTML, qui spécifie la même chose, mais ce n'est pas strictement nécessaire.
- Vous peut précisent également le
accept-charset
sur votre <form>
éléments.
- Les tables de la base de données sont définies avec l'encodage latin1
- La connexion entre PHP et la base de données est définie sur latin1
Si vous avez déjà des données dans votre base de données, vous devez savoir qu'elles sont probablement déjà perturbées. Si vous n'êtes pas encore en phase de production, effacez tout et recommencez. Dans le cas contraire, vous devrez procéder à un nettoyage des données.
Une remarque sur les métabalises, car tout le monde se méprend sur leur nature :
Lorsqu'un serveur web sert un fichier (un document HTML), il envoie des informations qui ne sont pas présentées directement dans le navigateur. Ces informations sont connues sous le nom d'en-têtes HTTP. L'un de ces en-têtes est l'en-tête Content-Type
qui spécifie le type de fichier (mimetype) (ex. text/html
) ainsi que l'encodage (ou charset). Alors que la plupart des serveurs web envoient un Content-Type
avec charset
info, c'est facultatif. S'il n'est pas présent, le navigateur interprétera à la place toutes les balises méta avec la mention http-equiv="Content-Type"
. Il est important de comprendre que la balise méta est sólo interprété si le serveur web n'envoie pas l'en-tête. En pratique, cela signifie qu'il n'est utilisé que si la page est enregistrée sur le disque et ouverte à partir de là.
Cette page a une très bonne explication de ces choses.