Base de connaissances
1 000 FAQ, 500 tutoriels et vidéos explicatives. Ici, il n'y a que des solutions !
Éviter les problèmes de caractères inhabituels et les soucis d'encodage des pages
Quand différentes instances se passent des données, des problèmes au niveau de l'encodage du texte peuvent survenir.
Par exemple si le codage de la page HTML est en UTF8 alors que la base de données est en latin-1 les accents ne vont pas êtres interprétés correctement par MySQL. Si les pages contiennent des caractères spéciaux (textes arabes, chinois, accents) ils peuvent s'affichent correctement sur votre site mais pas dans phpMyAdmin, ou inversement...
Pour que tout fonctionne il faut spécifier absolument partout le charset utilisé (UTF8 pour faire simple)...
Utilisez un éditeur de texte capable d'enregistrer vos fichiers en UTF8. Si vous importez des fichiers texte avec du code SQL à l'intérieur, il faut les éditer avec un logiciel qui enregistre en UTF8.
Forcez les headers du site en UTF8 avec cette fonction PHP:
header('Content-Type: text/html; charset=utf-8');
Ajoutez ceci dans les metas au niveau du code HTML:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
Déclarez l'encoding de vos bases de données et tables en UTF8 dans PHPMyAdmin (par exemple utf8_general_ci)
Ajoutez les lignes suivantes dans votre fichier .htaccess du dossier /web:
php_value default_charset utf-8
php_value mbstring.internal_encoding UTF-8
Ajoutez la fonction PHP mysql_set_charset à la connexion créée par mysql_connect afin de déterminer l'encodage de cette connexion (si vous ne la spécifiez pas, la valeur par défaut de ce paramètre peut varier d'un serveur à l'autre):
$connection = mysql_connect($server, $username, $password);
mysql_set_charset('utf8', $connection);
Vous pouvez également modifier ce paramètre par défaut sur tout votre hébergement en suivant cette documentation.
Une fois la connexion MySQL établie depuis un script PHP, vous pouvez aussi spécifier le type de charset UTF8 avec ces commandes:
mysql_query("SET NAMES 'utf8';");
mysql_query("SET CHARACTER SET 'utf8';");
Si vous récupérez un dump MySQL (sauvegarde) et que vous l'importez dans votre base de données, il peut arriver que tous les accents soient remplacés par des caractères bizarres (des "?" p.ex.).
Les sauvegardes des bases MySQL sont faites au format UTF8. Les caractères accentués sont alors codés sur deux octets. L'importation de ces sauvegardes ne pose pas de problème sur nos serveurs, cependant à vous d'adapter votre configuration maison pour l'importation en local des bases en UTF8 sur votre poste.
Vous pouvez par exemple faire une conversion utf8 -> latin1 du fichier SQL avant importation.
Sinon, lors de l'importation de la base, il vous suffit de spécifier que votre fichier d'entrée est au format iso-latin1 (section importer, "Jeux de caractère du fichier") et l'importation se déroulera correctement.
Quand les chars spéciaux sont convertis en '?', il est probable que le fichier que vous importez est en format non-UTF8 et le software est configuré pour importer un fichier UTF-8. Linux peut faire la conversion vers UTF-8 avec la commande 'iconv'.