Convertir un site SPIP 3 en utf-8 avec le plugin Grenier

SPIP 3 fonctionne nativement avec l’encodage universel unicode utf-8.

Sur certains sites (par exemple sur une mise à jour), on peut avoir un site qui est resté en iso-latin ce qui n’est pas conseillé (source de bugs, d’incompatibilité, ...) .

Voici la manière de le convertir simplement en utf-8.

Contrairement à SPIP 2 [1], on ne peut pas convertir le site directement par la partie privée, il faut passer par le plugin Grenier :

  1. Télécharger et activer le plugin Grenier
  2. Faire un sauvegarde de votre site (à la fois en créant un dump SPIP mais aussi un export MySQL sous phpMyAdmin pour pouvoir restaurer l’existant en cas de problème)
  3. Se rendre sur la page ecrire/?exec=base_convert_utf8
  4. Lancer le script !

Autre script lié à l’encodage de la base de donnée
Le plugin grenier dispose aussi d’un autre script qui lui permet de modifier l’interclassement de votre base pour le repasser en utf-8 si ce n’est pas le cas.

Par exemple : vous avez un site SPIP déclaré en unicode mais l’interclassement est resté en latin. (Si vous l’éditez sous phpmyadmin, les champs sont encodés bizarrement).

Dans ce cas, il faut appeler le script ecrire/?exec=base_convert_sql_utf8


Cas d’une base sqlite
Pour le cas très particulier des personnes avec une base en Sqlite.
Voici les lignes de commandes requises pour convertir votre base (astuce fournie par ben).

echo "On dump la base spip.sqlite dans un fichier dump.sql"  
echo ".dump" | sqlite3 spip.sqlite > dump.sql

echo "On convertit la base en utf8 à l'aide de l'utilitaire iconv" 
iconv -f iso-8859-1 -t UTF-8 < dump.sql > dump-utf.sql

echo "On reconstruit un fichier sqlite à partir du dump sql utf8" 
echo ".restore" | sqlite3 spiputf.sqlite < dump-utf.sql

echo "On met de coté la base iso"
mv spip.sqlite spip.sqlite.iso

echo "La base utf est maintenant la base spip "
mv spiputf.sqlite spip.sqlite

echo "Victoire (normalement) "

Autres ressources

Dans les cas où cela ne fonctionne pas, consulter aussi
http://zzz.rezo.net/Reparer-le-char...
https://contrib.spip.net/utf8-vrac-...

Pour les versions SPIP 2.1

Pour les anciennes versions de SPIP, le plugin grenier n’est pas nécessaire, les scripts sont disponibles à l’adresse suivante depuis la partie privée :

  • ?exec=convert_sql_utf8
  • ?exec=convert_utf8

Notes

[1SPIP 2 intégrait la commande ?exec=convert_sql_utf8, dont le nom est légèrement modifié depuis pour SPIP 3.

Discussion

12 discussions

  • Un grand merci pour ce plugin, depuis ce matin 11h00 je me suis retrouvé avec des ? à la place des accents, à la suite d’un changement de version de mysql. Recherches sur Google, forums, plein de tests et puis rien et là en 3 minutes c’est corrigé ! La première syntaxe m’a dit que mon site était en utf8, la 2 eme a tout réparé !
    ouf !

    Répondre à ce message

  • 1

    Bonjour,
    J’ai essayé d’installer ce plugin, mais toutes les deux versions sont marquées soit « version incompatible » (0.3.2) soit « version obsolète » (0.2.6). Mon site est actuellement sous version SPIP 3.1.8 [23955].
    Pourriez-vous m’expliquer comment faire, SVP ?
    D’avance merci.

    • bonjour,

      d’après https://plugins.spip.net/grenier.html

      la version grenier 0.3.2 est compatible avec SPIP 3.2+ télécharger
      la version grenier 0.2.6 est compatible avec SPIP 3.1+ télécharger
      la version grenier 0.2.4 est compatible avec SPIP 3.0+ télécharger

      Pour SPIP 3.1.8, il faut donc utiliser la version 0.2.6 ne devrait pas être indiquée obsolète..

      il faudrait que tu effaces la version grenier 0.3.2 de ton serveur et à la limite ré-télécharge la version 0.2.6

    Répondre à ce message

  • 2

    Soit un SPIP 1.9.x avec une base en iso-8859-1. En local après avoir importé la base mysql. Je connecte un nouveau SPIP3 tout frais. La migration de la base se déroule bien de 1.9 vers 3. Mon site est toujours en iso-8859-1 quand je vais dans ecrire/?exec=configurer_langue.

    J’active le plugin grenier ( svn co svn://zone.spip.org/spip-zone/_core_/plugins/grenier) .

    Puis je vais visiter ecrire/?exec=base_convert_utf8 et ecrire/?exec=base_convert_sql_utf8 Et hop c’est nickel !!!

    merci Erational

    • Bonjour,
      J’ai suivi exactement cette procédure mais résultat non satisfaisant, toujours des problèmes de codage dans les tables et dans le site.

    • En fait quand j’installe Spip 3.2, il m’affiche une langue principale en utf8 alors que les tables sont encore en iso-8859-1...

    Répondre à ce message

  • 1

    le lien vers le plugin est erroné :
    il y a 3 versions :
    grenier_30
    grenier_31
    grenier_32

    Merci pour ce plugin bien pratique !

    Répondre à ce message

  • 2

    Sur la page / ?exec=fulltext en haut j’ai X fois la mention « Une incohérence entre le charset de votre site et celui des tables de votre base de données risque de fausser les recherches avec caractères accentués :convertir en UTF-8 pour restaurer la cohérence »

    j’ai installé la version du plugin Grenier sur un SPIP 3.1.1 et j’ai Fichier convert_sql_utf8 introuvable pour / ?exec=convert_sql_utf8

    pour ?exec=base_convert_utf8 j’ai « Votre site est déjà en utf-8, inutile de le convertir... »

    Est-ce qu’avec le bon encodage en UTF-8 la recherche différencie les caractères accentués ? Pour l’instant c’est bien le cas sur mon site (mais ce n’est pas la panacée car beaucoup d’internautes ne les tapent pas) et donc une recherche sur « bebe » ne retournera rien même s’il y a tout bien de « bébé » dans les textes.

    Merci
    dd

    • J’ai un autre effet de bord lorsque le plugin grenier est activé : tout le contenu éditorial au centre de la page ecrire/ ?exec=accueil disparaît (liste des derniers articles, etc.)

      dd

    • ici aussi ecrire/ ?exec=base_convert_sql_utf8 donne juste :

      Fichier base_convert_sql_utf8 introuvable

      concernant le probleme "une recherche sur « bebe » ne retournera rien même s’il y a tout bien de « bébé » dans les textes."
      je suis a 100 % d accord, il faudrait faire comme google, et ignorer totalement les accents lors d une recherche

    Répondre à ce message

  • 2
    Mickael

    Merci pour ce plugin utilisé avec Spip 3.0.17
    Pour info, le plugin n’était pas visible l’admin, et l’url « ecrire/ ?exec=base_convert_utf8 » restait introuvable.
    Il a fallu que je rajoute ceci à la fin du fichier paquet.xml pour l’activer et accéder au script de conversion :
    <menu nom="grenier" titre="grenier:grenier" parent="menu_squelette" icone="images/grenier-32.png" action="configurer_grenier" />

    • ici aussi la version 3.0 ne fonctionne pas, il apparait bien dans la liste de plugins inactifs, mais apres activation « reussie » il reste dans la liste des inactifs, et les liens de conversion ne fonctionnent pas.

    • Pour info, je viens de tester sous SPIP 3.0.23-dev svn avec la version 0.2.4 (elle aussi svn) du plugin et je ne reproduis pas. Le plugin s’active bien, je le vois dans la liste des plugins actifs et j’ai bien accès à la page de conversion...

    Répondre à ce message

  • 2

    Bonjour,

    Merci pour ce plugin bien efficace avec Spip 3.0.
    J’ai malheureusement fait la mise à jour vers Spip 3.1 et là le plugin est incompatible.
    Il y a-t-il une solution ?
    Déjà merci de votre réponse

    Répondre à ce message

  • Ce plugin est excellent ! Je ne sais pas si c’est voulu mais il ne s’affiche pas dans la liste des plugins sur la page ecrire/ ?exec=charger_plugin

    dd

    Répondre à ce message

  • 1

    Bonjour,

    J’ai un site sur lequel la conversion de la structure des tables ne s’est pas bien déroulée, au final certains champs se sont retrouvés en utf8, d’autres sont restés en latin1.
    Ce qui est dommage, c’est que les erreurs MySQL rencontrées ne sont pas affichées.
    Je propose donc l’ajout de cette ligne juste après l’affichage des requêtes de conversion exécutées :
    if (!_DEBUG_CONVERT && sql_errno()!=0)  print '<p style="color:red;">Erreur: '.sql_error().'</p>';

    Avec ces affichages j’ai pu identifier un premier problème lié à des index FULLTEXT, que j’ai pu régler.

    Puis un second lot d’erreurs lié à la conversion intermédiaire en BLOB comme ces exemples :

    SQL : ALTER TABLE spip_articles CHANGE statut statut blob   NOT NULL
    Erreur : BLOB/TEXT column 'statut' used in key specification without a key length

    SQL : ALTER TABLE spip_articles CHANGE export export blob  DEFAULT 'oui'
    Erreur : BLOB/TEXT column 'export' can't have a default value

    Provenant de cette portion de code (fichier base/convert_sql_utf8.php ligne 92) :

      $type_texte= $row2['Type'];
      $type_blob = "blob";
      if (strpos($type_texte,"text")!==FALSE)
        $type_blob = str_replace("text","blob",$type_texte);

    plus bas on exécute (L107) :
    "ALTER TABLE spip_$nom CHANGE $champ $champ $type_blob $default $notnull"

    En clair, le type destination est d’office blob sauf si le type orifinal est machinTEXT alors il devient machinBLOB. Je suppose qu’il faut passer provisoirement en binaire pour éviter une quelconque transformation des données lors du passage en utf8 (?). Toujours est-il que cette opération est refusée sur beaucoup de champs (généralement en VARCHAR). Faut-il s’en inquiéter ?

    Sont concernés les champs (soit avec une valeur par défaut, soit utilisés dans un index) :
    -  statut, export, lang, langue_choisie de spip_articles
    -  login, statut, source, webmestre de spip_auteurs
    -  objet, vu de spip_auteurs_liens
    -  langue_choisie de spip_breves
    -  media, mode, distant, extension de spip_documents
    -  objet, vu de spip_documents_liens
    -  objet, statut de spip_forum
    -  objet de spip_jobs_liens
    -  nom, impt de spip_meta
    -  objet de spip_mots_liens
    -  actif, installe, superieur, obsolete, attente de spip_paquets
    -  statut de spip_petitions
    -  prefixe de spip_plugins
    -  lang, langue_choisie de spip_rubriques
    -  statut de spip_signatures
    -  statut, moderation, miroir, oubli, resume de spip_syndic
    -  url, statut de spip_syndic_articles
    -  extension, inclus, upload, media_defaut de spip_types_documents
    -  url, type de spip_urls
    -  objet de spip_versions
    -  objet de spip_versions_fragments
    (sans parler des autres champs ou tables non installées par le core)

    Ca fait beaucoup de champs en erreur sur cette étape de conversion en BLOB ; cela dit, beaucoup d’entre eux contiennent des chaînes prédéfinies (objet, langue, statut) qui ne poseront pas de problème.

    J’ai modifié le script pour qu’il affiche les erreurs et des instructions SELECT DISTINCT champs à copier-coller dans phpMyAdmin pour vérifier que les données de ces champs en erreur n’ont pas subi de dommages.
    Il peut être téléchargé à cette adresse (site du Kit labos CNRS) : http://www.harmoweb.cnrs.fr/IMG/zip/convert_sql_utf8-2.zip

    Pour info, aucun de ces champs récalcitrants à la conversion en BLOB n’ont finalement posé de problème de conversion.

    • Une autre remarque : j’ai constaté que les champs `statut` varchar(10) NOT NULL DEFAULT '0', (présents dans de nombreuses tables) perdent leur valeur par défaut '0' après conversion des structures.

      Géré en ajoutant L105 :
      $default = $row2['Default'] || $row2[’Default’]===’0’ ?(" DEFAULT ".sql_quote($row2['Default'])):"";

    Répondre à ce message

  • Super boulot, cela m’a pris à peine 30s. Bravo !!!

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

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

Dernière modification de cette page le 27 novembre 2018