Php/ajax encodage partiel

Résolu
Bonjour a tous,
mon probleme est assez énervant =/
et j'ai beau sillioner les forum ...
je n'ai toujours pas reussi a resoudre mon probleme :(

alors voila,
j'ai fait un miniChat (en ajax) sur mon site.
il fonctionne tres bien mis a part un point ...
  -> l'encodage >.>

je m'explique :
	pour contrer les eventuelles injections SQL j'utilise les fonctions suivantes:
		- mysql_real_escape_string()
		- htmlspecialchars()
	puis pour encoder les accents j'utilise :
		- htmlentities()
	
	a la sortie j'utilise :
		- html_entity_decode() avec comme argument 'ENT_NOQUOTES'
	
	les accents passent bien, et les \ qui protegent les quotes sont enlevés
	mais reste un probleme,
	certains caractères speciaux ne passent tout de meme pas =/
	( exemple : € , ™ , ... )
	
	je sais que le xml généré par ajax est en utf-8
	mais normalement le 'htmlentities' rectifie ce probleme
	( sauf pour € car le 'decode' passe en iso-8859-1
		alors que l'€ est dans l'iso-8859-15 )
	mais meme ™ ne passe pas car il lui donne un code ascii invalide >.>
	
	j'ai d'ailleurs aussi remarqué que si j'enlève le 'htmlentities'
	alors le ™ s'affiche mais plu les accents =S

si quelqu'un a une idée pour resoudre mon probleme ...
je lui en serais tres reconaissant ^^

PS : voici les bouts de mon code ^^
  en entrée :
	$message=
	mysql_real_escape_string(htmlspecialchars(htmlentities($_POST['message'])));
  en sortie :
	$message=
	strtolower(html_entity_decode($donnees['ChatMsg'],ENT_NOQUOTES));
  sachant que ma db est en latin1_general_ci
Configuration: Windows XP
Firefox 2.0.0.14

6 réponses

  1. Salut

    Moi je mets ce header :

    <?php
    header('Content-Type: text/html; charset=ISO-8859-1');
    ?>


    au début de toutes mes pages .php qui seront appelées avec Ajax.
    1. Je me permets de remonter ce fil car je cherche à faire la même chose; ça fonctionne à peu près avec dans l'appel ajax :

       xhr_object.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");


      dans chaque page :
      header('Content-Type: text/html; charset=ISO-8859-15');


      et pour le texte saisi:
      html_entity_decode(htmlentities($msg),ENT_NOQUOTES);


      SAUF lorsqu'on fait du copier coller (exemple je copie ' " / \ & é è à @ (TM) (tm) € (euro) sur cette même page et je le colle dans ma zone de saisie, sur IE (6) j'ai les carré a la place de l'euro et du TM

      sinon ça roule sur FF

      Une idée?
      1. utilise encodeURIComponent dans ton encodate de tes posts à la place de escape et tout sera résolu (et tu pourras envoyer de zolis posts en utf-8
        1. Ben vi même le € ! par contre c'est vrai j'ai bidouillé un peu pour le ... &
          1. Bsr

            Hum j'ai eu le même problème : j'ai essayé ta solution mais rien à faire avec ISO-8859-15 ca ne fonctionne pas
            Avec ISO-8859-1 ça fonctionne sous FF mais pas sous IE

            Finalement j'ai supprimé le header de ma page appellée et dans la requête AJAX je passe directement
            this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");

            Et pour le moment ça fonctionne sur IE et FF ouf !

            1. meme le '€' ? ^^
              normalement il n'est pas ds iso-8859-1 mais ds le iso-8859-15 ^^
            2. this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1"); 


              je confirme ca marche aussi pour moi

              merci
          2. up !

            personne ? =S
            1. re up!!
              toujours personne ? =/
            2. @Brachiorre re up !! ( j'le remonte toutes les heures sait on jms xD lol ^^ )
              j'ai vraiment besoin d'un p'tit coupe d'pouces s'iou plait =S
              a vot' bon coeur m'sieu dame ... c'est pour l'artiste !! Oo
            3. @Brachiorj'donne un exemple concret ( pour ceux qui tomberont par hasard ici Oo )
              voila les resultats ^^

              message a afficher :
              ' " / \ & é è à @ ™ (tm) € (euro)

              mysql_real_escape_string(htmlspecialchars(htmlentities($_POST['message'])))
              ' " / \ & é è à @ & #8482; (tm) ¤ (euro)

              ( j'ai mis un espace entre le & et #8482; car ccm.net le traduit en ™ lol ^^ )

              mysql_real_escape_string(htmlspecialchars($_POST['message']))
              ' " / \ & ? ? ? @ ™ (tm) ? (euro)
            4. @Brachiorc'est l'h de l'up Oo lol

              bn dc tjs personne ? :snif: :'(
            5. @BrachiorOh Oh Oh ...

              on est jms mieux servie que part soit meme ^^

              j'post tt d'meme ma reponse pr ceux que ca interesse :)

              suffit de forcer la meta en mettant :

              header('Content-Type: text/html; charset=ISO-8859-15');


              avant chaque affichage ;)

              voila ^^ merci a moi
              de rien de rien ..
              si si j'insiste :)

              bn ok j'arrete lol ^^ bye all ^^