Le 29/1/2010, 17:18
[Résolu] Problème de recherche avec accents dans Spip !

Depuis maintenant quelques temps, nous avions remarqué que certains sites sous spip avaient la recherche qui ne marchait pas bien. Ils ne trouvaient pas les mots avec accents.

Après un peu de recherche et grâce à notre expertise Linux Mysql & co, nous avons trouvé la solution, que nous vous confions ici, exemples et explications à l’appui !

Êtes-vous concernés par ce bug ?

Tout d’abord, il faut que vous testiez que ce bug vous concerne bien.

Pour cela, rendez-vous dans l’interface d’administration de votre spip, et tapez une recherche sur un mot avec accent, tel qu’il est entré dans un de vos articles.

Si spip ne vous retourne aucun résultat, c’est probablement que ce bug vous concerne !

Attention : il se peut que spip vous sorte quand même un résultat, par exemple si votre article contient à la fois le mot avec et sans accent. Par exemple, si un article contient "médecin" et "medecin", spip va bien le trouver si vous cherchez "médecin".

Ensuite, nous avons corrigé ce bug dans le contexte d’un site sous Spip avec une base de données en UTF-8. Pour vérifier que votre base est en UTF-8, rendez-vous dans l’espace privé de votre spip, et cliquez sur "Configuration" > "Gestion des langues" et regardez le bloc "Jeu de caractères du site". Il doit être en utf-8

Si ces 2 facteurs sont les mêmes chez vous, il y a de grandes chance que vous puissiez corriger ce bug en quelques minutes !

Enfin, pour en être sur, si vous avez accès à votre base de données via PHPMyAdmin, rendez-vous sur la table spip_articles et regardez le contenu de votre articles. si les mots avec accents apparaissent "encodés" un peu comme ça : "Réunion de travail du réseau" c’est très bon signe : on va pouvoir vous aider.

Je propose 2 modes de résolutions différents :

- Le premier requiert de pouvoir accéder en console SSH à la machine qui héberge votre base de données, ou à une machine qui vous permet d’accéder en direct à la base de votre site. C’est le mode console
- Le second mode de résolution nécessite de pouvoir accéder à votre base de données Spip via l’outil de gestion de bases de données nommé PHPMyAdmin. C’est le mode phpmyadmin.

Suivez donc l’un des paragraphes correspondant pour résoudre votre problème.

ATTENTION : Faites une sauvegarde complète de votre base de données avant de procéder à ces modifications. Je ne saurais être responsable de toute perte de données sur votre site, comme il se doit !

Résoudre le problème de recherche avec les accents dans Spip : Mode Console

Tout d’abord, munissez-vous des nom d’utilisateurs, mot de passe, et nom de la base de données de votre site spip. Ces informations seront utilisées dans les commandes ci-dessous.

Ensuite, tapez les commandes suivantes : (note : si vous ne les comprenez pas du tout, demandez à un ami qui s’y connait hein, je ne veux pas que vous perdiez vos données ;) )

$ mysqldump -unom_utilisateur -pmot_de_passe --quote-names --set-charset  --default-character-set=latin1 nom_de_base_spip > dump.sql
$ cat dump.sql |sed -e 's/latin1/utf8/g' >dump2.sql
$ mysql -unom_utilisateur -pmot_de_passe  nom_de_base_spip < dump2.sql

Ensuite, modifiez le fichier config/connect.php pour y ajouter, juste après le spip_connect_db, la ligne suivante :

mysql_query("SET NAMES 'utf8'");

Résoudre le problème de recherche avec les accents dans Spip : Mode phpmyadmin

Si vous avez uniquement accès à votre base de données via PHPMyAdmin, connectez-vous à votre interface phpmyadmin et procédez ainsi :

- cliquez sur "Exporter", puis cochez "SQL" "Structure" "Ajouter DROP TABLE..." "Données" "Transmettre"
- cliquez sur "Exécuter", phpmyadmin vous fait télécharger un fichier dump sql au nom de votre base de données.
- ouvrez le fichier dump obtenu à l’aide d’un éditeur de document. Pour notre exemple, je montrerais comment faire avec emacs sous Linux ou Notepad++ sous Windows. Sous Mac, bein débrouillez-vous ;) (ou essayez d’utiliser un editeur de texte et la ligne de commande iconv, surement disponible sur mac)
- vérifiez que dans les première lignes, vous avez quelque chose du genre :

/*!40101 SET NAMES utf8 */;

Si vous ne l’avez pas, je ne garantis pas le résultat ...
- cherchez "=latin1" et remplacez-le partout par "=utf8" (théoriquement c’est en fin de chaque définition de table que l’on retrouve cette chaine.)
- si vous utilisez notepad++, allez dans "Encodage" > "Convertir en Ansi" puis "Encodage" > "Encoder en UTF-8 (sans BOM)". Une fois cela fait, vous avez normalement de jolis accents de visible dans votre dump des articles !
- sauvez le dump ainsi obtenu
- retournez dans phpmyadmin
- cliquez sur "Importer"
- cliquez sur "Parcourir" et allez chercher le fichier dump modifié dans votre disque dur
- choisissez "utf8" dans "jeu de caractères du fichier"
- cliquez sur "Exécuter"
(Cela peut prendre un peu de temps le temps de tout uploader)

Si vous utilisez Linux et Emacs pour éditer votre fichier, une fois ce dernier modifié (latin1>utf8), utilisez la ligne de commande suivante :

$ iconv -f UTF-8 -t ISO8859-1//IGNORE <dump.sql >dump2.sql

Cela pourrait marcher (mais j’avoue ne pas avoir vraiment essayé ...)

Enfin, et dans tous les cas, dans les fichiers de votre site spip, modifiez le fichier config/connect.php pour y ajouter, juste après le spip_connect_db, la ligne suivante :

mysql_query("SET NAMES 'utf8'");

Qu’est-ce que j’ai fait à ma base ?

La question que l’on nous a posé souvent avant (ou après) avoir fait cette manipulation : Mais j’ai fait quoi à ma base avec ces commandes ?

Et bien pour faire court : vous avez rendu cohérent la structure de données et les jeux de caractères et interclassements de MySQL et ceux utilisés par Spip.

Pour l’explication longue, comme cela nécessite de faire un gros chapitre sur les interclassements, les clés de tris, les jeux de caractères et tout et tout, et bien cela sera dans un prochain billet :) (très prochain je vous le promet...)

(une petite intro à ce billet pour la route ...

En fait, MySQL, le serveur de base de données, sert à stocker des données. À priori, si on ne lui demande que de stocker ou rapatrier des données, MySQL se moque du jeu de caractères de vos données. Par contre, si vous effectuez une recherche, mysql va effectuer une comparaison. Si on lui demande de trier des données selon un champ texte, il va devoir trier des données texte pour vous les retourner.

Et c’est là que les jeux de caractères entrent en scène : En effet, en Français, si l’on trie, les caractères éèê et ë doivent être considérés comme s’ils étaient un e, et de même pour les autres accents. Lorsque l’on recherche, dans certaines langues, on peut aussi ignorer les accents.

)

5 Messages

  • Bonjour,
    mon cas est un peu similaire a celui ci. Mais au niveau de la base de données dans la table spip_article tout est nikel. J’ai un problème de codage au niveau du mailing, aprés avoir activé le plugin spip-liste 1.9.3 si je veux généré un courrier j’ai des caractères bizarre. Mais quand j’ai transféré le site ailleurs dans un autre serveur tout marche nikel, alors je me dis que le problème vient de chez vous.

    le texte ressemble a ca :

    Bonne année 2010 solidaire et équitable
    Le Mouvement pour l’Economie Solidaire vous adresse ses meilleurs vÃ…"ux pour l’année 2010. Nous espérons que cette année 2010 contribue au développement d’une économie solidaire au service des femmes et des hommes de notre pays.

    Merci de me repondre trés rapidement ej suis vraiment dans la galère

  • Bonjour,

    Sur mon site, les accents ne sont pas reconnus par le moteur de recherche interne de SPIP 2.0.10 en iso-8859-1. Je ne peux pas le convertir en UTF-8, j’ai 10 sites connectés sur la base de données de mon site principal et tous les sites sont en iso-8859-1.

    Lorsque je regarde ma table spip_articles dans MySQL, les accents apparaissent correctement.

    Y a-t-il une solution possible ?

    Merci beaucoup !

    • Bonjour,

      J’ai continué mes recherches. J’ai un autre site dont le jeu de caractère est UTF-8, ma base de données est UTF-8 et tous mes accents apparaissent correctement dans la base de données et dans le site et pourtant je n’arrive pas à faire une recherche avec un mot possédant un accent.

      Mon site www.zaa.cc, en ce moment sur la page d’accueil on peut voir que j’ai un article dont le titre commence par "Dépliant...".
      Dans le moteur de recherche, si je tape "Dépliant", le moteur ne trouve aucun résultat. En passant, j’ai plusieurs articles aillant dans le titre le mot dépliant.

      Des idées ?

      Merci !