Bonjour à tous,
j'ai une page qui m'affiche des points d'interrogation à la place des caractères accentués.
Je précise que les caractères accentués inclus dans la page elle-même sont correctement reconnus.
Ceux qui posent problème proviennent d'une requête mysql.
J'ai bien trouvé la solution qui consiste à mettre $bdd->query("SET NAMES 'utf8'"); après la connexion à la BDD. Je confirme que ça fonctionne.
Néanmoins j'aimerais bien comprendre d'où vient le problème et si il n'y a pas moyen que tout s'affiche correctement sans cette petite ligne de code!
Actuellement dans mon en-tête de page j'ai mis : <meta charset="utf-8" />
Mon fichier est enregistré en encodage utf-8 (sans BOM).
En ce qui concerne ma BDD, elle était de base en latin1-swedish, j'ai passé l'interclassement de mes tables en utf8_general_ci.
Malgré tout ça toujours des "?"...
Y aurait-il une modif que j'aurais oublié?
Merci d'avance pour votre aide!
Lina01 je ne t'apporte aucune réponse mais ton post ma enlevé une fière chandelle du pied ! Smiley biggol
J'allais m'arracher mon dernier cheveux puis voilà bim bam boum tu te pointes et me fais remarquer mon oubli de $bdd->query("SET NAMES 'utf8'"); Smiley murf
Alors MERCI MERCI et reMERCI!!!!! Smiley biggrin
Non il ne faut pas enlever cette ligne et c'est tout à fait normal.

L'encodage doit être correctement maîtrisé et le cas échéant spécifié dans tous les maillons de la chaîne, maillons qui sont les suivants :

1 - Encodage de la base de données, des tables et des champs
Pour celui-là il faut aller voir dans la doc du SGBD utilisé

2 - Encodage de la connexion à la base de données
Pour MySQL, c'est le fameux set names utf8

3 - Encodage des fichiers de code source et/ou des chaînes compilées (php, java, C#, python, ...)
IL n'y a aucune possibilité d'indiquer l'encodage du code php, java, C#; il faut être scrupuleux et enregistrer ses fichiers en UTF-8, ou alors échapper les chaînes littérales correctement, p.ex. \x##
Les pythonneux ont de la chance, ils ont une marque au début du fichier qui permet de l'indiquer, marque du style #-*UTF-8-*# (voir la doc pour la syntaxe exacte)

4 - Utiliser des fonctions adaptés à l'UTF-8 dans son code
Pour php, mb_* vs str*, flag u avec preg_*, ...
En C# et java, beaucoup moins de problèmes vu que l'encodage interne est UTF-16... donc sauf si on doit traiter des caractères qui sont en deux points de code UTF-16, on n'a pas de souci à se faire.
Je ne sais pas ce qu'il en est pour python.

5 - Encodage des fichiers de données et des codes source de sortie (HTML, CSS, js, ...)
Pour HTML, c'est <meta charset="utf-8" />
Pour js et CSS je ne sais pas si on a cette possibilité; il me semblais avoir vu traîner des @charset(utf8) mais je ne sais pas si c'est standard

6 - Encodage de la connexion HTTP
Ca, c'est le rôle de Content-Type. Pour un document HTML ça donne Content-Type:text/html; charset=utf-8.

7 - Support du navigateur
Normalement en 2014, ça ne pose plus aucun problème dans le cas d'UTF-8.

IL semblerait, ou tout au moins en statistiquant un peu les posts qui arrivent ici, que l'étape n°2 soit celle qui soit le plus souvent oubliée.
Modifié par QuentinC (26 Jul 2014 - 16:36)
Modérateur
Pas sûr de moi là mais il me semble avoir rencontré ce même problème. En passant du latin1-swedish à l'utf-8_general_ci, les caractères ne sont pas encodés en utf-8, il faut une étape supplémentaire pour les convertir en utf-8 dans la base de données. Je ne sais plus comment j'avais fait, désolé, mais je pense que tu peux trouver ça sur le Web...
Comme dit, je ne suis pas sûr de moi du tout... (j'aurais peut-être mieux fait de ne rien dire...)