Problème d'encodage de caractères

  • Auteur de la discussion Auteur de la discussion tryan
  • Date de début Date de début
WRInaute passionné
Bonjour,

Je suis confronté à un soucis d'encodage...

J'ai une interface admin en utf-8 et les pages vues par les visiteurs sont en iso-8859-1 . J'utilise htmlentities() avant d'enregistrer en bd ce qui fait que les é sont encodés en é .
J'utilise html_entity_decode() en sortie de bd pour l'affichage et mes é sont affichés en é.
J'ai éssayé aussi avec utf8_decode et utf8_encode combiné également à htmlentities() et html_entity_decode() mais rien y fait .. j'ai toujours un affichage pourrit de certains caractères...
Pour un des champs d'enregistrement j'utilise fckeditor qui lui m'enregistre mes é en é et la sa fonctionne !
Comment dois-je encoder pour obtenir des é car il me semblait que c'était htmlentities() ?

Merci
 
WRInaute accro
Passe tout en utf-8 ! C'était trop la prise de tête avec le passage en phpBB3 qui est tout en utf8 alors j'ai passé mon site en utf8 :)

A pu de &eacute de mes ...
 
WRInaute passionné
J'aimerais bien, mais le soucis est que le site existe depuis un moment et à été créé de façon fixe (page statique) et maintenant par nécessité, je le passe en dynamique.
Donc toutes mes pages actuelles sont iso-8859-1 et je dois faire avec ... d'ou mon soucis ^^!

Il doit bien y avoir un moyen simple puisque fckeditor m'encode un des champs correctement.

Merci
 
WRInaute accro
tryan a dit:
Comment dois-je encoder pour obtenir des é car il me semblait que c'était htmlentities() ?

Merci

avec une fonction faite maison tu devrais remédier à ton probleme :

Code:
function TexteUnicode($texte){
$tab1 = array("à","è","é","ê","ù","»","«","°","œ","oeil");
$tab2 = array("à","è","é","ê","ù","»","«","°","œ","œil");
$texte = str_replace($tab1,$tab2,$texte);
return $texte;
}
 
WRInaute passionné
darkjukka: je me pose la question de savoir pourquoi j'ai encoder en utf-8 au lieu de iso-8859-1 car ta solution si simple soit elle semble fonctionner :wink: ... (la j'ai les boulles ^^).

KOogar: merci pour ta fonction :D , je la garde de coté pour le moment et je teste tout en iso-8859-1 avant.

Pour remédier à mes soucis d'encodage actuelle, (à titre indicatif) j'utilise cette fonction:
Code:
function jevireaccents($machaine)
{    

    $machaine=($machaine);
    
    $pasaccents = Array("/ç/","/ä§/","/é/","/ä©/","/è/","/ä¨/","/ê/","/äª/","/ë/","/ä«/",
"/Ê/","/äŠ/","/Ë/","/ä‹/","/î/","/ä®/","/ï/","/ä¯/","/ì/","/ÃŽ/","/äŽ/",
"/ò/","/ä²/","/ô/","/ä´/","/ö/","/ä¶/","/õ/","/ó/","/ø/","/äµ/","/ä³/",
"/ä¸/","/Ô/","/ä”/","/Ö/","/ä–/","/Ã/","/ä/","/â/","/ä¢/","/ä/","/ä¤/","/Ã¥/",
"/ä¥/","/Â/","/ä‚/","/Ä/","/ä„/","/ù/","/û/","/ü/","/ä¼/","/Û/","/Ãœ/","/ä¹/",
"/ä»/","/ä¼/","/ä¼/","/ä›/","/äœ/","/ò/","/ñ/","/’/");

    $dessans = Array("ç", "ç", "é", "é", "è", "è", "ê", "ê", "ë", "ë", "Ê", "Ê", "Ë", "Ë", "î", "î", "ï", "ï", "ì", "Î", "Î", "ò", "ò", "ô", "ô", "ö", "ö", "õ", "ó", "ø", "õ", "ó", "ø", "Ô", "Ô", "Ö", "Ö", "à", "à", "â", "â", "ä", "ä", "å", "å", "Â", "Â", "Ä", "Ä", "u", "û", "ü", "ü", "Û", "Ü", "u", "û", "ü", "ü", "Û", "Ü", "ñ", "ñ", "'");
    
    $machaine = preg_replace($pasaccents, $dessans, $machaine);  
      
    return $machaine; 
}

Merci à vous :D
 
WRInaute accro
tryan a dit:
J'ai une interface admin en utf-8 et les pages vues par les visiteurs sont en iso-8859-1 . J'utilise htmlentities() avant d'enregistrer en bd ce qui fait que les é sont encodés en é .
J'utilise html_entity_decode() en sortie de bd pour l'affichage et mes é sont affichés en é.
J'ai éssayé aussi avec utf8_decode et utf8_encode combiné également à htmlentities() et html_entity_decode() mais rien y fait .. j'ai toujours un affichage pourrit de certains caractères...
Pour un des champs d'enregistrement j'utilise fckeditor qui lui m'enregistre mes é en é et la sa fonctionne !
Comment dois-je encoder pour obtenir des é car il me semblait que c'était htmlentities() ?

Plusieurs solutions, par ordre de préférence décroissant:
- la meilleure: tout basculer en UTF-8
- stocker en base en UTF-8, et décoder à l'affichage: utiliser utf8_decode à l'affichage
- stocker en base en ISO-8859-1: utiliser utf8_encode au moment du stockage (et utf8_decode si jamais tu recharges un truc de la base dans l'interface d'admin)
- la plus simple, mais tu auras un souci un jour ou un autre: tout laisser en ISO-8859-1

Quel est l'intérêt d'utiliser des entités HTML?

Jacques.
 
WRInaute passionné
- la meilleure: tout basculer en UTF-8
Je ne peux pas .. j'ai déjà beaucoup de pages statiques (crée une par une à la main) en ISO-8859-1 et sa m'obligerais à les reprendre une par une.

- stocker en base en UTF-8, et décoder à l'affichage: utiliser utf8_decode à l'affichage
Déjà essayé et comme expliqué plus haut, mon site est entièrement en ISO-8859-1. Seul les parties que je créé actuellement (admin entre autre) sont en utf-8, d'ou les soucis d'encodage. Le menu créé dynamiquement est inclue également dans les pages déjà présentes (ISO-8859-1) ce qui génère des soucis entre le charset utilisé dans les pages et l'encodage utilisé avant l'enregistrement en bd.

- stocker en base en ISO-8859-1: utiliser utf8_encode au moment du stockage (et utf8_decode si jamais tu recharges un truc de la base dans l'interface d'admin)
Je ne suis pas sur d'avoir comprit!! Passer mon admin en ISO-8859-1 et enregistrer en bd avec utf8_encode. Utiliser utf8_decode seulement pour la partie admin ... la je suis perdu ^^!

- la plus simple, mais tu auras un souci un jour ou un autre: tout laisser en ISO-8859-1
Pourquoi ? Quelle soucis?

Quel est l'intérêt d'utiliser des entités HTML?
J'en sais rien ... je ne demande pas à avoir des entités HTML lors de mes enregistrements, sa se fait tout seul quoi que je fasse.

Merci
 
WRInaute accro
tryan a dit:
- la meilleure: tout basculer en UTF-8
Je ne peux pas .. j'ai déjà beaucoup de pages statiques (crée une par une à la main) en ISO-8859-1 et sa m'obligerais à les reprendre une par une.

Ce que je ne comprends pas, c'est pourquoi tes pages statiques t'obligent à avoir un encodage dans les pages dynamiques ? Tu peux très bien avoir tes pages dynamiques en utf-8 et les statiques en iso-8859-1 ?
 
WRInaute accro
tryan a dit:
- la meilleure: tout basculer en UTF-8
Je ne peux pas .. j'ai déjà beaucoup de pages statiques (crée une par une à la main) en ISO-8859-1 et sa m'obligerais à les reprendre une par une.

iconv est ton ami.

tryan a dit:
- stocker en base en UTF-8, et décoder à l'affichage: utiliser utf8_decode à l'affichage
Déjà essayé et comme expliqué plus haut, mon site est entièrement en ISO-8859-1. Seul les parties que je créé actuellement (admin entre autre) sont en utf-8, d'ou les soucis d'encodage. Le menu créé dynamiquement est inclue également dans les pages déjà présentes (ISO-8859-1) ce qui génère des soucis entre le charset utilisé dans les pages et l'encodage utilisé avant l'enregistrement en bd.

Pas sûr de comprendre... Tu as des données en ISO-8859-1 dans ta BDD?
Sinon le principe de cette solution est justement de convertir UTF-8 -> ISO ce qui vient de ta bdd avant de l'afficher.

admin (utf-8 ) -> bdd (utf-8 ) -> utf8_decode -> affichage (ISO)

tryan a dit:
- stocker en base en ISO-8859-1: utiliser utf8_encode au moment du stockage (et utf8_decode si jamais tu recharges un truc de la base dans l'interface d'admin)
Je ne suis pas sur d'avoir comprit!! Passer mon admin en ISO-8859-1 et enregistrer en bd avec utf8_encode. Utiliser utf8_decode seulement pour la partie admin ... la je suis perdu ^^!

J'avais permuté utf8_decode/encode :-(

En clair:
admin (utf-8 ) -> utf8_decode -> bdd (en ISO, donc) -> affichage (ISO)

et bdd -> utf8_encode -> admin si tu "lis" des choses de la bdd dans l'interface admin

tryan a dit:
- la plus simple, mais tu auras un souci un jour ou un autre: tout laisser en ISO-8859-1
Pourquoi ? Quelle soucis?

On ne peut pas tout encoder en ISO-8859-1. Même le symbole euro n'existe pas (il faut passer en ISO-8859-15 ou windows-1252 pour l'avoir, et il n'a pas le même code dans les deux cas...).

tryan a dit:
Quel est l'intérêt d'utiliser des entités HTML?
J'en sais rien ... je ne demande pas à avoir des entités HTML lors de mes enregistrements, sa se fait tout seul quoi que je fasse.

Ben tu disais toi même utiliser htmlentities... Qui fait d'ailleurs des choses bizarres parce que tu lui donnes de l'UTF-8 alors qu'il attend de l'ISO-8859-1 par défaut (mais tu peux lui dire que c'est de l'UTF-8, il suffit de lire la doc: http://fr2.php.net/manual/en/function.htmlentities.php)

Jacques.

[edit: fix incorrect auto-smileys]
 
WRInaute passionné
Marie-Aude a dit:
Ce que je ne comprends pas, c'est pourquoi tes pages statiques t'obligent à avoir un encodage dans les pages dynamiques ? Tu peux très bien avoir tes pages dynamiques en utf-8 et les statiques en iso-8859-1 ?

C'est à cause du menu commun que j'utilise aussi bien sur les pages statiques que dynamiques. J'ai enregistré directement en bd chaque url, titre, description des pages statiques afin d'avoir une meilleurs gestion de mon menu. Je finis par mit perdre moi même :lol: .

jcaron: merci pour ta réponse précise :D,j'ai testé et sa fonctionne.
Concernant htmlentities(), j'ai créé un espace membre comportant un formulaire et je l'utilise pour éviter d'avoir des soucis au niveau des balises html, script...
Ce qui m'amène à une autre question:
htmlentities() s'utilise avant l'enregistrement en bd ou uniquement en sortie?
 
WRInaute accro
tryan a dit:
Marie-Aude a dit:
Ce que je ne comprends pas, c'est pourquoi tes pages statiques t'obligent à avoir un encodage dans les pages dynamiques ? Tu peux très bien avoir tes pages dynamiques en utf-8 et les statiques en iso-8859-1 ?

C'est à cause du menu commun que j'utilise aussi bien sur les pages statiques que dynamiques. J'ai enregistré directement en bd chaque url, titre, description des pages statiques afin d'avoir une meilleurs gestion de mon menu. Je finis par mit perdre moi même :lol: .

Ben tu convertis tout ça en UTF-8 aussi, et hop :-)

tryan a dit:
Concernant htmlentities(), j'ai créé un espace membre comportant un formulaire et je l'utilise pour éviter d'avoir des soucis au niveau des balises html, script...
Ce qui m'amène à une autre question:
htmlentities() s'utilise avant l'enregistrement en bd ou uniquement en sortie?

Moi je ne l'utiliserais qu'à l'affichage...

Jacques.
 
WRInaute passionné
Je reviens sur ce topic puisque j'ai moi même été confronté au problème

Ainsi avant affichage de la chaîne on la passe dans cette fonction
Code:
function JsToDb($msg)
{
	$msg = html_entity_decode($msg);
        $msg = addslashes($msg);
	//$msg = htmlentities($msg);
        
	$msg = str_replace("é", "é", $msg);

	$msg = str_replace("è", "è", $msg);

	$msg = str_replace("ê", "ê", $msg);

	$msg = str_replace("ë", "ë", $msg);

	$msg = str_replace("à", "à", $msg);

	$msg = str_replace("ä", "ä", $msg);

	$msg = str_replace("â", "â", $msg);

	$msg = str_replace("ù", "ù", $msg);

	$msg = str_replace("û", "û", $msg);

	$msg = str_replace("ü", "ü", $msg);

	$msg = str_replace("ô", "ô", $msg);

	$msg = str_replace("ö", "ö", $msg);

	$msg = str_replace("î", "î", $msg);

	$msg = str_replace("ï", "ï", $msg);

	$msg = str_replace("ç", "ç", $msg);

	$msg = str_replace("&", "&", $msg);

	return $msg;
}
 
WRInaute impliqué
Si ce n'est pas du déterrage en beauté ça.

Sinon, ton code, c'est la pire des choses à faire.

Pour résoudre ces problèmes, il faut comprendre d'où cela provient, sinon cela ne règle rien du tout.
Voici un article que j'ai écrit il y a plusieurs mois déjà, mais apparemment toujours d'actualité :
Comment résoudre les problèmes d’accents ?
 
WRInaute passionné
Perso et pour résoudre mon soucis de l'époque, j'avais utilisé simplement utf8_decode() avant enregistrement en bd et utf8_encode() en sortie pour les pages en charset=utf-8.
 
WRInaute impliqué
biddybulle a dit:
Tout à fait,

Perso, j'ai appliqué mon ratio habituel argent / Temps passé = cette solution.

ca vient pas de mysql déjà ca vient d'une fonctionnalité développée dans cette classe
http://www.raymondhill.net/blog/?p=441#comment-10463

Si tu peux d'ailleurs aider Raymond ce serait cool

Merci

Un pull a déjà été demandé :
https://github.com/gorhill/PHP-FineDiff/pulls

Je ne sais pas si ce dernier résout le problème, mais tu peux déjà y regarder.
 
WRInaute passionné
Merci tout plein Blount pour avoir regarder. Cela résout mon problème !!

Je vais poster ce lien sur le blog de Raymond pour les autres
 
Discussions similaires
Haut