[résolu] accents utf8 base de données

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour à tous,

Voilà, c'est mon premier projet sur Drupal. J'ai réussi pour l'instant à faire pas mal de trucs : création de modules personnalisés, etc...

Mon problème que je n'arrive pas à résoudre est le suivant : ma base de données est bien en utf8, mon environnement sur Eclipse est aussi par défaut en utf8 (donc tout mon code en utf8), et le charset (par défaut celui de Drupal) est bien évidemment en utf8. Toutes les applications que j'ai réalisées auparavant étaient aussi basées sur l'encodage utf8. La différence était que les accents étaient convertis en caractères spéciaux dans mes tables, du type "é" devient "é". Cela m'a toujours paru normal, puisque je n'avais aucun problème à l'affichage sur mon navigateur.

Sur les tables de ma base de données avec Drupal, les accents ne sont pas convertis. Le "é" va resté un "é" dans la base de données. Ceci me semble déjà bizarre. Par contre, je n'ai pas de problème à l'affichage. Là où ça pêche, c'est lorsque je récupère des données sur une base de données externe (qui est elle-même en utf8). Drupal ne réalise aucune conversion des données, et me garde les caractères spéciaux.

Voici donc ma question :
- Est-ce normal, avec Drupal, d'obtenir des données avec accent en base ?
- Pourquoi les données qui sont encodées en utf8 sur ma base externe, ne s'affichent pas correctement avec Drupal ?

Merci pour vos réponses...

Version de Drupal : 

J'ai eu le problème avec un export de base utf-8 fait sous windows et réimporté sous Linux (utf-8)
En choisissant comme encodage latin lors de l'import de la base, cela a résolu le problème.
A mon avis ça vient d'un problème d'encodage entre les plates-formes.

Merci pour votre réponse. Je ne pense pas que ça vienne de là. Je n'ai rien importé, ni exporté de bases pour l'instant. J'ai tout sur le même serveur. Donc logiquement, quand une donnée est rentrée sur la base Drupal, elle devrait être encodé en UTF-8, et non pas garder les accents. Sur mes autres application qui ne sont pas avec Drupal, ça fonctionne très bien, les caractères accentués ou du type 'ç' sont modifiés en caractères spéciaux en base.

Alors peut-être que par défaut, Drupal garde les accents en base, mais ça ne me parait pas logique... Et surtout la récupération des mes données sur la base externe ne sont du coup pas convertis à l'affichage.

J'ai résolu mon problème.

Voici une explication qui permettra, je l'espère par la suite, aider d'autres personnes.

Depuis que je programme en php, je ne me suis jamais posé la question de savoir comment les données étaient enregistrées dans ma base de données. J'ai toujours fait attention de bien encoder mes fichiers en UTF8, d'avoir une base de données en UTF8 (charset, colonnes, jeux de caractères), d'avoir un charset html en utf8 : bref, tout en utf8. Par contre, ce que je ne savais pas, c'est que nativement, PHP utilise de l'ISO pour faire les requêtes SQL. Pour tous mes anciens projets, j'avais donc des données codées en ISO dans des tables en utf8. Ce qui me donnait des caractères spéciaux en base à la place des accents. Exemple : "é" devenait "é" en base. Par contre, à l'affichage, tout fonctionnait très bien, puisque le navigateur l'interprétait comme du charset utf8, et faisait la conversion.

Drupal réalise tout ça correctement :). Mais si vous réalisez une application sans Drupal, n'oubliez pas d'ajouter avant chaque requête SQL, cette requête : mysql_query('SET NAMES "UTF8"'). Ou tout simplement, changer la variable dans le fichier config du serveur...

Voilà. Du coup, j'ai résolu mon problème : quand je récupère mes données sur mon ancienne base externe, j'utilise la requête -> 'SET NAMES latin'..

Ici, un tuto sympa pour créer toute son application Full utf8 : http://blog.neovov.com/index.php?2007/03/06/143-convertir-un-site-en-utf-8
En sachant que PHP 6 intègrera nativement l'UTF8.