Lutter contre les problèmes d'encodage en PHP
Voici un exemple de code php, à utiliser si l'on veut éviter les problèmes d'encodage en PHP (en une seule ligne).
$chaine = htmlentities($chaine, ENT_QUOTES, mb_detect_encoding($chaine));
Cette ligne fait les actions suivantes :
- détection de l'encodage de la chaine : mb_detect_encoding($chaine)
- puis convertion de tous les caractères spéciaux par leur code html
Cela peut-être pratique dans le cas d'insertion de données dans une base, on évitera ainsi les problèmes d'encodage, les problèmes d'insertion de quotes ...
De plus, on pourra réafficher sans aucun traitement les données dans une page web, car les navigateurs actuels effectuent eux-mêmes la conversion des caractères spéciaux.
16 Commentaires pour "Lutter contre les problèmes d'encodage en PHP"
Flux des commentaires de cet article Ajouter un commentaireLe mieux : homogénéitée DB / fichier + apache bien configuré.
J'ai pu passer tout les sous domaine de feodra-fr en utf-8 (adaptation pour le forum punBB) sauf mailman qui dans sa localisation francophone ne veux que du latin 1, que j'ai configuré via un virtualhost.
J'utilise cette méthode dans le cadre du développement de la version 3.0 du moteur de planet-libre.org.
Il y a de nombreux cas de flux xml qui indiquent qu'ils sont en UTF-8 et dont le contenu est en ISO ...
Cette méthode se révèle alors la plus perfomante !
Je sais que c'est difficile de se rappeler des numéros, mais merci d'appeler les charsets ISO 8859 par leur nom et pas juste "ISO". (Plus précisément, il s'agit normalement soit de l'ISO 8859-1, soit de l'ISO 8859-15 pour les textes en français.)
Non seulement, l'UTF-8 est aussi un charset ISO (décrit dans le standard ISO 10646), mais en plus pas mal de textes "en ISO" ne sont pas du tout en un charset ISO, mais en le CP 1252 de M$ qui contient les caractères de l'ISO 8859-1 plus certains autres (comme le symbole euro, symbole qui n'existe pas du tout en l'ISO 8859-1!
L'ISO 8859-15 contient ce symbole, mais comme il n'est pas entièrement compatible avec l'ISO 8859-1 (il a remplacé certains caractères) et comme ce n'est pas le choix fait par M$, son adoption reste limitée - je pense que les utilisateurs susceptibles d'utiliser l'ISO 8859-15 sont pour la plupart passés directement à l'UTF-8, les autres suivent les choix de M$ et donc le CP 1252).
Pti Seb
Merci pour ce billet mais comme je suis un boulet pourrais-tu, stp, être + précis sur le nom du fichier et son emplacement dans un blog ?
@daria : il s'agit ici d'une fonction, donc tu peux la mettre dans n'importe quelle page php d'un site. Il faut juste bien l'intégrer au code.
Nickel !!
Après avoir galéré pour régler mes problèmes d'accents et signe euro, voilà une solution qui fonctionne à la perfection !
un grand merci !
Vous avez de la chance, moi je me prend un méchant :
Warning:htmlentities() charset `ASCII' not supported, assuming iso-8859-1 in [path file]
Mon serveur est une Debian Etch / MySQL5, PHP5, mbstring ok ..
Le pb avec cette fonction c'est que mon texte contient des balises HTML
qui se retrouvent affichées.
@lm : tu peux peut-être utiliser une fonction inverse de décodage dans ce cas. Exemple :
echo html_entity_decode($chaine, ENT_QUOTES, 'UTF-8')
Mille merci pour cette fonction, jla connaissais pas avant.
En tout cas elle est venu au bon moment =)
merci merci merci mille merci !!
j'étais dans une situation tellement farfelue... ce code vient de tout corriger, sans effort.
bonjour
je suis entrain de dévélopper un site web en arabe: je rencontre un problem d'encodage en utilisant la fonction htmlentities pour afficher un text arabe depuis la base de donnée mysql :
la table de la base de donnée :
create table aud(
iId int unsigned NOT NULL auto_increment,
title varchar(255) NOT NULL ,
PRIMARY KEY (audId)
)ENGINE=MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
le code php
résultat : ???????
Yo people, long time reader first time poster here
psyched to be a member, and I'm keen to start getting more active here
Until then visit my page http://fridaynitebytes.com/unpeople/?p=11&preview=true
NiksBela 7 I consider, that you are mistaken. Write to me in PM.
_____________
vigra
genericorder online
3
Bonjour (et en mode je post avec quelques mois de "retard") : iconv de php ou en commande système peut aussi résoudre une masse de problèmes d'encodage (j'ai eu le problème il y a quelques jours).
Bonjour et merci à simon pour avoir donner la piste du iconv.
Pour faire un rapide topo, via je devais uploader (par API)une page html déposé par une personne. Le hic c'est qu'une personne pouvait très bien me déposer une page en UTF-8 en ISO-8859-1. Les pages en elles même pouvait comporter des caractères différent de l'encodage annoncé (merci également aux caractères cadratin, ).
iconv(mb_detect_encoding($string), 'UTF-8', $string);
En espérant que cela puisse servir à d'autre.