PHP : Problème d'encodage au niveau du passage des variables

nicopulsenicopulse Membre
15:25 modifié dans Langages Web & serveurs #1
Bonjour à  tous,  ;)

Je travaille actuellement sur un projet web iPhone (HTML/PHP/SQL/JS/AJAX avec FrameWork WebApp) avec une base Oracle et Apache  :P le tout hébergé sous Windows Server 2003.  :why?:

Après avoir résolu les erreurs d'encodage des fichiers à  l'enregistrement
⇨ encoder en ISO 8859-1 et pas en UTF-8
Utiliser la fonction entête au début des pages php :
⇨ header('Content-Type: text/xml; charset=ISO-8859-1');

Je me heurte maintenant à  des problèmes d'encodage au niveau du passage des variables d'un formulaire à  une page de traitement (requête POST en AJAX). Je viens de passer une journée entière à  essayer de le résoudre en vain.  :'(

Exemples :
( é ) coté formulaire devient ( àƒÂ© ) sur la page de traitement
( ‘ ) coté formulaire devient ( \‘ ) coté traitement

Je m'en suis aperçu car lors du traitement j'utilise :
⇨ htmlentities()
⇨ htmlspecialchar()
Ces deux fonctions ne font absolument rien sur les variables que je voudrais traiter.

En effectuant des tests (echo), je me suis aperçu que les variables qui contienne des caractères spéciaux sont directement mal encodé dans le $_POST !

Voici le problème sur un test simple (méthode GET) :

xi24912166148.png

J'en déduis que c'est un problème au niveau du passage des variables !

Et je ne sais pas comment résoudre ce problème. Mais je pense qu'il faut forcer le navigateur (ici Safari) à  passer des variables en ISO-8859-1 et non pas en UTF-8 comme il à  l'air de le faire.
Et il faut le forcer à  deux endroits :
⇨ Passer les requêtes POST en ISO-8859-1 au niveau d'une requête AJAX.
⇨ Passer les requêtes POST en ISO-8859-1 au niveau du problème simple illustré ci-dessus.

Voilà  donc si quelqu'un à  une idée ou à  l'expérience de ce genre d'aventure ! Je suis preneur d'explications !

Merci d'avance !

Réponses

  • muqaddarmuqaddar Administrateur
    15:25 modifié #2
    Pourquoi n'es-tu pas en full UTF-8 ?
    J'entends par là  : code de la page et base de données.

    Sinon, la page qui affiche ton formulaire est-elle aussi en ISO-8859-1 ?
  • AliGatorAliGator Membre, Modérateur
    15:25 modifié #3
    Ce n'est pas officiellement valide de passer un caractère comme "é" dans une URL (en paramètre GET), il faut l'encoder avec les %xx : d'après la RFC sur les URLs HTTP, cet encodage se fait avec l'encodage ISO-Latin-1 (ISO-8859-1), donc ça devrait passer...

    Cependant, il faut vérifier que Safari autodétecte bien que le contenu à  afficher, lui, est bien de l'ISO-Latin-1 (que t'affiche-t-il dans le menu "Présentation -> Encodage de texte" ?).

    Le mieux pour vérifier ça est d'encapsuler ton code PHP dans un wrapper HTTP où tu précises dans une balise <meta> le Content-Type avec son encodage (oui, en plus de le préciser en header HTTP avec la méthode header() de PHP)
  • apocaalypsoapocaalypso Membre
    15:25 modifié #4
    Tu peux également utiliser htmlentities() pour convertir ton "é" dans l'URL.
  • schlumschlum Membre
    15:25 modifié #5
    Non... htmlentities transforme "é" en "&eacute;"... super pour une URL  :fouf):
  • AliGatorAliGator Membre, Modérateur
    15:25 modifié #6
    C'est plutôt urlencode() ou rawurlencode() qu'il faut utiliser
  • CeetixCeetix Membre
    15:25 modifié #7
    Tiens je up un coup même si ça fait un bon moment :p
    Pour les soucis \' utilise stripslashes() et ce sera gagné ^^
  • sekaijinsekaijin Membre
    15:25 modifié #8
    tu as dans la conf de php (php.ini) un magic quote qui t'ajoute ou pas de façon automatique de \ à  certain caractères

    c'est un truc qui ne devrait Jamais être à  On sauf pour raison de compatibilité avec des vieux script php
    donc s'il est à  on (phpinfo() t'indique l'état de la chose)

    pour ce qui est de tes caractères c'est normal ajax se base sur un composant appelé XmlHttpRequest qui comme son nom l'indique est fait pour faire des requêtes Xml en Http il utilise Utf-8 qui est l'encodage préconisé pour le XML

    c'est donc normal que tu reçois tes variable encodé en UTF-8
    il te suffit de faire un utf8_decode de ta variable pour pouvoir la lire

    si un même script peut être appelé par un formulaire en Iso-latin-1 et un appel Ajax en utf-8 lorsque l'appel se fait en ajax tu reçois dans l'entête http une entrée qui t'indique qu'il s'agit de XmlHttpRequest tu peux donc facilement poser une condition pour décoder ou non tes variables

    Mais il est très fortement conseillé de faire des scripts différents pour traiter les appel ajax et les appel http classiques même s'il utilisent les mêmes fonction.

    A+JYT
Connectez-vous ou Inscrivez-vous pour répondre.