Convertir la base MySQL de WordPress en UTF-8

Lors de la mise en place de WordPress sur ce site, j’avais décidé de ne pas passer le site en UTF-8. A ce moment là, je passais de DotClear à WordPress et mon DotClear était en ISO-8859-1…

Aujourd’hui dans le cadre de mon « Summer Refresh », j’en profite pour convertir ma base en UTF-8.

Le problème c’est que ce n’est pas simple… Voici comment, je pense y arriver.

Une des difficultés de cette opération, c’est qu’il faut la réaliser à travers un navigateur web. En effet pour manipuler les informations de ma base, il faut que je passe par phpMyAdmin .

Les étapes

J’ai d’abord commencé par faire une extraction du contenu de ma base (un dump) avec l’encodage latin1 (ISO-8859-1), je me suis bien évidemment dit qu’il ne me restait plus qu’é convertir le fichier et le réinsérer dans MySQL. J’ai donc pris mon éditeur de texte préféré et j’ai lancé la conversion du fichier de ASCII vers UTF-8. Après insertion des nouvelles données, c’est malheureusement l’échec…

Après un coup de google, je me rend compte que pour bien faire, il faudrait que je fasse un dump via mysqldump puis une conversion avec iconv et l’opération inverse avec mysqldump. Mais il faut prendre en compte la contrainte du navigateur : pas de mysqldump. Et comme je suis sous Windows, je n’ai pas accès à iconv.

C’est lé que php vient à notre secours : il va nous permettre de faire une conversion vers UTF-8 via la fonction utf8_encode . Mais encore une fois cela ne fonctionne pas correctement, phpMyAdmin refuse obstinément d’intégrer le fichier. Je trouve un commentaire dans la documentation php qui conseille de manipuler les fichiers en binaire avec cette astuce, je peux ensuite intégrer mon contenu de WordPress avec un nouvel encodage via phpMyAdmin en précisant que le fichier doit être lu en binaire.

Voici le code utilisé pour convertir le fichier en UTF-8, avec les entêtes et un format binaire.

<?php
// Récupération du fichier à convertir
$str = file_get_contents($_REQUEST['file']);
// Ouverture en binaire du fichier oé l'on va écrire
$fh = fopen($_REQUEST['file'].'_UTF','wb');
// Conversion puis écriture dans le fichier
fwrite($fh, "\xEF\xBB\xBF".utf8_encode($str));
// Fermeture du fichier
fclose($fh);
?>

 </p> 

Ce script doit bien entendu être utilisé en local, car il n’est pas du tout sécurisé : le fichier est passé directement en paramètre sans contrôle…

La manipulation finale

  1. Dans phpMyAdmin, exporter de la base de données
  2. Editer le contenu du fichier et supprimer toutes les informations d’encodage au niveau des instructions de création de table (DEFAULT CHARSET…)
  3. Convertir le fichier avec le script php ci-dessus
  4. Créer un nouvelle base avec un encodage par défaut de type UTF-8
  5. Insérer le fichier via phpMyAdmin dans la nouvelle base en utilisant le jeu de caractère binaire
  6. Remplacer l’ancienne base par la nouvelle
  7. Ne pas oublier de convertir les fichiers de WordPress : les fichiers de thème, le fichier de localisation, …

Cet article a été publié le 21/09/2005 par Seb