HTML5 / CSS 2.x/3 / PHP / MySQL ...

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:

sélection de l'interclassement en UTF8

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:

sélection de la connexion en UTF8

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:

sélection d'un champ en UTF8

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:

base de données en UTF8

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.

Tous les articles sur ce thème