Encoder la base de données en UTF-8
Maintenant que nous avons nos pages HTML et nos scripts PHP parfaitement encodés en UTF-8, il faut s'assurer que les données de la base mySql sont également gérées en UTF-8.
Création de notre base en UTF-8
Sous phpMyAdmin, si la base n'est pas encore créée, au moment de la nommer, sélectionnez l'interclassement UTF-8:

Si la base de données existe déjà, faites au préalable une sauvegarde globale des données. Ensuite, basculez l'interclassement général en UTF-8.
Procédez de même pour l'interclassement lors de la consultation de la base sous phpMyAdmin:

Définir les champs des tables pour l'encodage UTF-8
Toujours sous phpMyAdmin, on va maintenant créer les différentes tables. Pour chacun des champs de type texte, on sélectionnera l'interclassement UTF-8:

Les champs numériques et de type date n'ont pas besoin d'encodage.
Si vous changez l'encodage de données existantes, vous risquez de perturber les caractères existant. Procédez avec précaution et vérifiez régulièrement que vous n'avez pas altéré les caractères spéciaux en les rendant illisibles. Si c'était le cas, répétez les opérations en récupérant une copie des données de la table ou en partant d'une table vide puis en chargeant les données sauvegardées.
Il existe différents encodages UTF8. Préférez l'encodage utf8_general_ci
qui n'a pas de spécificité régionale et est insensible à la casse de caractères.
Gestion des données en UTF-8
Voilà. Notre base de données est interclassée en UTF-8, les données sont stockées en UTF-8 dans des champs interclassés en UTF-8:

Nous allons voir maintenant comment les scripts PHP peuvent accéder à ces données. Au moment d'ouvrir la base de données sous PHP, voici les instructions nécessaires et suffisantes:
function connect() { $connection = mysql_connect($host,$user,$password); $db_selected = mysql_select_db($base, $connection); if (!$db_selected) { echo 'Impossible d\'utiliser la base : ' . mysql_error(); return; } $dbh = $db_selected; // si encodage UTF-8 des données de la base, sinon mettre cette ligne en commentaire mysql_query("SET NAMES 'utf8'"); }
la partie de code la plus importante est située en dernière ligne:
SET NAMES 'utf8'. Si on ne l'exécute pas, toute sortie en
SELECT contenant des caractères accentués sera altérée.
Coté script PHP, il faut évidemment que le code source soit sauvegardé en UTF8. Il faut également
générer un en-tête via la fonction header pour indiquer au client final - le navigateur -
que l'encodage du flux est en UTF8:
header('Content-type: text/html; charset=UTF-8');
Si vous suivez ces recommandations, elles sont nécessaires et suffisantes pour
que votre application soit full-UTF8. Vous ne recourrez à utf8_encode
et utf8_decode seulement pour le traitement des données externes
non encodées en UTF8.
L'hybridation ISO-UTF est fortement déconseillée. Toute la chaîne logicielle doit être homogène. Il est possible cependant de faire quelques exceptions. C'est le cas si on intègre un framework ou une librairie nouvelle dans un environnement déjà en exploitation et non encodé en UTF8. On pourra exploiter les ressources de ce framework (ou toute autre librairie) sous réserve que lesdites ressources n'émettent pas de message contenant des caractères autres que le jeu ASCII standard.