PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 21-04-2012 11:05:49

Sq78
Membre
Inscription : 13-05-2009
Messages : 47

Problème de caractères accentués et éventuelle solution

Bonjour,
J'ai un problème sur un programme avec les caractères accentués.

1er point:
Le champ de ma table est : titlePage varchar(255) latin1_swedish_ci

Quand je regarde le contenu du champ, j'ai par ex: L'équipe Séniors 1 féminines (Dép. 1) avec les accents visibles...

Quand je suis sur mon site dans le programme, les accents se transforment comme ceci : L'quipeSniors 1 fminines (Dp. 1)

Et pourtant mon fichier .php est bien converti en UTF8 sans BOM et j'ai bien : <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> dans mon entête.

2ème point:
J'ai remarqué que si dans la BDD je change é par é, ça fonctionne.
Ca, je peux donc le modifier, n'ayant pas des dizaines de millions d'enregistrements:-)
Mais dans ce cas, comment faire en sorte que les enregistrements à venir utilisent ce codage des caractères ? que rajouter avant les insert ?

Quelqu'un a une idée svp pour ces 2 points différents ?

Hors ligne

#2 21-04-2012 15:33:49

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème de caractères accentués et éventuelle solution

Bonjour,

C'est malheureuseument le problème, quand on fait des choses/met des choses en place sans comprendre ce que l'on fait. Mais bon c'est pas grave, on est là pour ça wink
De se mettre en UTF8 du côté php c'est bien, mais cela veut dire quoi? Cela veut dire (oui je sais ça a l'air idiot) que tout ce qui est traité par le serveur PHP et tout ce que le serveur PHP envoie, il le fait au format UTF8. Donc ce que votre navigateur va recevoir ou votre serveur MySQL, il va le recevoir encodé en UTF8. Or, la collation de votre champ titlePage est définie en latin1_swedish_ci qui n'a rien à voir avec l'UTF8, puisque les caractères en latin1 sont codés sur un octet au lieu de 2 en UTF8.
Alors attention, cela signifie pas qu'il faut tout mettre en UTF8 sur son serveur mySQL lorsque l'on travaille en UTF8 en PHP, même si globalement et de manière très général on pourrait dire que oui.
En effet il peut parfois être préférable pour des recherches en mode full text ou pour réduire la volumétrie de la base de définir certaines colonnes en latin1 ou tout autre collation basée sur un codage à un octet, comme par exemple une colonne CHAR(5) qui ne va contenir aucun caractère spécial et que des lettres de A-Z par exemple, pour peu que cette colonne soit indexée et à forte dispersion, la recherche n'en sera que plus performante.
Au delà de ces considérations, trois possibilités s'offrent à vous techniquement. soit
1) vous faites un UTF8_decode() sur tout ce que vous envoyez à mySQL et un UFT8_encode() pour tout ce qui en vient/revient
2) vous changez la collation de votre serveur/base de données/tables/colonnes en UTF-8 de mémoire via un ALTER TABLE ... CHANGE COLLATION avec un risque que certaines conversions se fassent mal (non correspondance entre un encodage d'une collation à une autre), auquel cas, vous devrez mettre à jour les lignes concernées manuellement.
3) Vous basculez votre application PHP en ISO au lieu UTF8, ce qui risque de ne pas être envisageable selon si par exemple votre site est localisé (gestion multilangues).

Note : en ce qui concerne é au lieu de é c'est normal que cela fonctionne car é ne contient aucun caractère spécial interprété différement par les serveurs.

Cordialement,

Jc.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 21-04-2012 17:30:57

Sq78
Membre
Inscription : 13-05-2009
Messages : 47

Re : Problème de caractères accentués et éventuelle solution

Bonjour,
Merci pour la réponse fort claire.
Néanmoins, il y a quelque chose de curieux. Toutes mes tables (De tous les programmes) sont en latin1_swedish_ci. Tous les champs de texte comportent des accents. Tous les accents sont visibles ET dans la BDD, ET dans les programmes qui sont tous encodés en UTF8. Le seul qui me pose problème, c'est celui-ci.
C'était un peu le pourquoi de ma question.

Hors ligne

#4 21-04-2012 19:07:44

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème de caractères accentués et éventuelle solution

Bonsoir,

Ce que je viens d'exprimer est la base, ensuite, il peut y avoir de nombreuses raisons, locales ou globales dans le contexte, qui font que localement un problème d'encodage survient à l'éxécution.
Il m'est donc difficile de m'aventurer plus loin dans le diagnostic sans prendre de risques quant à la pertinence de mes propos.

Néanmoins, votre dernière intervention me laisse penser que votre serveur n'est pas configuré en UTF-8 et que l'encodage se fait au niveau des routines d'affichage de votre application. Il faut en effet savoir que ce n'est pas avec un UTF8 déclaré dans une balise méta que vous changez l'encodage au niveau des traitements PHP, cela signifie juste à votre navigateur qui va interpréter votre page, que le fichier html et son contenu sont encodés au format UTF-8 et qu'il doit les interpréter comme tels.
Par conséquent je pense qu'une résolution immédiate de votre problème passe par un réencodage local de votre variable (vérifiez avant que cela ne soit pas du à un double encodage) avec utf8_encode/utf8_decode.

Cordialement,

Jc

Dernière modification par Jc (21-04-2012 19:12:29)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums