Passez votre base SPIP en Unicode

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Vous avez envie de passer à Unicode, mais vos anciens articles sont toujours en Latin 1. Il va donc falloir convertir votre base !

Vous avez envie de passer à Unicode, mais vos anciens articles sont toujours en Latin 1 (ISO-8859-1). Il va donc falloir convertir votre base !

La conversion va se faire en trois étapes : créer une sauvegarde de la base, convertir cette sauvegarde, et la recharger. Attention, on utilise pour faire cela des outils UNIX ; ça a été testé sous GNU/Linux, et ça devrait marcher ailleurs (tels que FreeBSD, ou Cygwin sous Windows), mais je ne vous promets rien :-) Allez, c’est parti !

Dump de la base

Cela se fait très facilement par le programme mysqldump [1] :

$ mysqldump -a -Q -q -c -u <user> -p --add-drop-table --add-locks -v <db_spip> > spip-20030718-iso8859-1.dump

Remplacez évidemment <user> et <db_spip> par l’utilisateur et la base de données de votre site SPIP.

Attention, à partir de maintenant, toute modification faite sur le site ne sera pas prise en compte. Il convient donc de prévenir les auteurs et les autres administrateurs, si besoin est.

Conversion en UTF-8

UTF-8 est une manière (la plus utilisée en fait) d’encoder de l’Unicode. Attention cependant, si vous avez déjà des bouts d’Unicode dans votre base, allez d’abord voir la dernière partie de cet article !

Pour faire notre conversion, on va utiliser iconv, dont c’est la fonction principale :

$ iconv -f ISO8859-1 -t UTF-8 spip-20030718-iso8859-1.dump > spip-20030718-UTF-8.dump

Et voilà !

Importation du dump converti

Puisqu’on a utilisé --add-drop-table lors de notre sauvegarde, on peut facilement utiliser directement le dump converti. Pour faire cela, deux méthodes.

-  Se connecter d’abord à MySQL, puis charger le dump avec la commande source :

$ mysql -u<user> -p <db_name>
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4830 to server version: 3.23.49

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> source spip-20030718-UTF-8.dump

-  La deuxième méthode est plus courte :

$ mysql -u<user> -p <db_name> < spip-20030718-UTF-8.dump

Et voilà, « théoriquement », c’est bon :-)

Une partie de l’ancienne base est déjà en UTF-8 !

Et oui, cela arrive... Notamment lorsque comme nous, à MiNET, vous utilisez un rugbyman comme webmaster, qui active le mode UTF-8 de SPIP avant que la base ne soit convertie.

Cela nécessite un peu plus de travail, mais Perl va venir à notre rescousse. Le truc est de convertir certains caractères UTF-8 en ISO8859-1 :

$ perl -MEncode -pe 'for $a qw(à è ì ò ù À È Ì Ò Ù ä ë ï ö ü Ä Ë Ï Ö Ü á é í ó ú ç Á É Í Ó Ú Ç ÿ Ÿ â ê î ô û Â Ê Î Ô Û ß » « ¢) { $c = encode ("UTF-8", $a) ; s/$c/$a/g ; } print;' spip-20030718-iso8859-1.dump > spip-20030718-iso8859-1-real.dump

Rajoutez évidemment tous les caractères que vous pensez avoir utilisés après le passage de SPIP en Unicode (je pense notamment au caractère euro, que je ne peux pas produire avec ce clavier US :-).

Et vous pouvez ensuite procéder avec iconv sur ce nouveau fichier ! [2]

Notes

[1Voici l’explication des options utilisées :

  • -a : ajoute les options de création spécifiques à MySQL ;
  • -Q : protège les noms de table et de colonne par des quotes ;
  • -q : n’utilise pas de tampon ;
  • -c : utilise des instructions INSERT complètes ;
  • -u : nom d’utilisateur pour la connexion à la base ;
  • -p : demande un mot de passe ;
  • —add-drop-table : ajoute une commande « DROP TABLE table » avant chaque CREATE ;
  • —add-locks : ajoute des locks autour des commandes INSERT ;
  • -v : affiche des informations pendant le dump.

[2Comme vous êtes des petits malins, vous avez déjà deviné que vous pouviez tout faire avec Perl, car Perl c’est mortel :

$ perl -MEncode -pe 'for $a qw(à è ì ò ù À È Ì Ò Ù ä ë ï ö ü Ä Ë Ï Ö Ü á é í ó ú ç Á É Í Ó Ú Ç ÿ Ÿ â ê î ô û Â Ê Î Ô Û ß » « ¢) { $c = encode ("UTF-8", $a) ; s/$c/$a/g ; } print encode ("UTF-8", $_);' spip-20030718-iso8859-1.dump > spip-20030718-UTF-8.dump

Bon, je l’ai pas testé, mais ca devrait marcher ;-).

Comme d’habitude, les références indispensables :

  • man mysqldump
  • man iconv
  • perldoc perlrun

La version originale de cet article se trouve sur le site MiNET

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom