IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Caractères accentués avec Ajax


Sujet :

AJAX

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut [AJAX] Caractères accentués avec Ajax
    Bonjour,

    pour mon site, je souhaite créer un formulaire en ajax. Il fonctionne bien. Le seul problème est que les caractères accentués ne sont pas bien transmis.

    J'essaye pourtant de tout forcer en utf-8 mais apparemment, il me manque une étape !

    Merci d'avance pour votre aide.

    Voici le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
              <form method  ="post"
                    enctype ="multipart/form-data"
                    action  ="javascript:mail_ajax()"
                    onsubmit="javascript:return verification_donnees(this);" >
    						<div id="formulaire">
    	            <p>Th&egrave;me du message&nbsp;:</p>
    	              <select name="categorie" size="1">
      	              <option>Probl&eacute;me d'affichage</option>
      	              <option>Accessibilit&eacute;</option>
      	              <option>Rubrique musique</option>
      	              <option>Rubrique danse</option>
      	              <option>Rubrique photos</option>
      	              <option selected="selected">Autre</option>
      	            </select>
                  	<p>Titre</p>
    	              <input name="titre" type="text" maxlength="70" />
    	              <p>Adresse mail (facultatif)&nbsp;:</p>
      	            <input name="adresse" type="text" maxlength="70" />
    	              <p>Contenu (limit&eacute; &agrave; 5000 caract&egrave;res)&nbsp;:</p>
    	              <textarea name   ="corps"
    	                        rows   ="10"
    	                        onkeyup="javascript:limite_taille(this);"></textarea>
    	              <p>Pi&egrave;ce jointe (taille limit&eacute;e &agrave; 5Mo)&nbsp;:</p>
    	              <input name="piece_jointe" type="file" size="40" />
                    <input name ="envoyer"
                           type ="submit"
        	                 value="Envoyer"
    											 id   ="bouton" />
    						</div>
              </form>
    Qui appelle un script javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <?
    $categorie = utf8_decode($_POST[categorie]);
    $titre     = utf8_decode($_POST[titre]);
    $adresse   = utf8_decode($_POST[adresse]);
    $contenu   = utf8_decode($_POST[contenu]);
    $pj        = $_POST[pj]; // Avec utf8_decode, les fichiers avec accents ne sont pas lus
     
    $reception = "Moi <monadresse@truc.fr>";
     
    // Entête générique
    $entete_mail  = "MIME-Version: 1.0\r\n";
    $entete_mail .= "Date: ".date("D, j M Y H:i:s O")."\r\n";
    // Entête si champs adresse mail rempli
    if($adresse!="") {
    	$entete_mail .= "Reply-To: $adresse\r\n";
    }
     
    // Mandatory for file_exists and filesize function
    clearstatcache();
     
    if($pj=="") $erreur_pj = 1; // Pas de pièce jointe
    else {
    	if(!file_exists($pj) || filesize($pj)>5242880) { // Maximum de 5Mo ou pièce inexistante
    		echo "2";
    		return;
    	}
    	$erreur_pj = 0; // Une pièce jointe
    }
     
    // Si pas de pièce jointe, mail classique
    if($erreur_pj) {
    	$entete_mail.="Content-Type: text/plain; charset=utf-8\r\n";
    	$entete_mail.="Content-Transfer-Encoding: 8bit\r\n";
    }
    // Sinon, insertion de la pièce attachée
    else {
    	include("mime_function.php");
    	$path_parts = pathinfo($pj);
    	$ext        = $type[strtolower($path_parts["extension"])];
    	$boundary   = "----=".md5(uniqid(mt_rand()));
    	$entete_mail .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n\r\n";
    	$entete_mail .= "--".$boundary."\r\n";
    	$entete_mail .= "Content-Type: text/plain; charset=utf-8\r\n";
    	$entete_mail .= "Content-Transfer-Encoding: 8bit\r\n";
    	$entete_mail .= "Content-Disposition: inline\r\n";
    	$contenu .= "\r\n\r\n--".$boundary."\r\n";
    	$contenu .= "Content-Disposition: attached\r\n";
    	if($ext=="") $ext = "application/octet-stream";
    	$contenu .= "Content-Type: ".$ext."; name=\"".$path_parts["basename"]."\"\r\n";
    	$contenu .= "Content-Transfer-Encoding: base64\r\n";
    	$contenu .= "Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"\r\n\r\n";
    	$fp   = fopen($pj, "r");
    	$file = fread($fp, filesize($pj));
    	$file = chunk_split(base64_encode($file));
    	$contenu .= $file;
    	$contenu .= "\r\n\r\n--".$boundary."--\r\n";
    }
    $status_mail = mail($reception,"Site Cuba (".$categorie.") - ".$titre,$contenu,$entete_mail);
     
    $status_mail = 1;
     
    echo $status_mail;
    ?>
    Et mon PHP de traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    function mail_ajax() {
    	// Montrer le statut
      if(document.all) var information = document.all["status"];            //IE
      else             var information = document.getElementById("status"); //FF
      information.style.visibility = "visible";
    	// Requête ajax
      var httpRequest = false;
      if(window.XMLHttpRequest) {
        httpRequest = new XMLHttpRequest();
        if(httpRequest.overrideMimeType) {
          httpRequest.overrideMimeType('text/xml');
        }
      }
      else if(window.ActiveXObject) {
        try {
          httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e) {
          try {
            httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {}
        }
      }
      if(!httpRequest) {
        alert("Impossible de cr\351er une instance XMLHTTP. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
    		information.style.visibility = "hidden";
        return;
      }
      try {
        httpRequest.open("POST", "../scripts/envoi_mail.php", true);
      }
      catch(e) {
        alert("L'ouverture du fichier distant a \351chou\351. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
    		information.style.visibility = "hidden";
        return;
      }
     
      try {
        var categorie = document.forms[0].categorie.value;
        var titre     = document.forms[0].titre.value;
        var adresse   = document.forms[0].adresse.value;
        var contenu   = document.forms[0].corps.value;
        var pj        = document.forms[0].piece_jointe.value;
        // /X/g est utilisé pour remplacer toutes les occurences sinon, /X ne remplace que la première
        contenu  = contenu.replace(/&/g,escape("&"));
        titre    = titre.replace(/&/g,escape("&"));
        titre    = titre.replace(/\r/g," ");
        titre    = titre.replace(/\n/g," ");
        adresse  = adresse.replace(/&/g,escape("&"));
        pj       = pj.replace(/&/g,escape("&"));
        var data =  "categorie="+categorie+"&titre="+titre+"&adresse="+adresse+"&contenu="+contenu+"&pj="+pj;
        httpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        httpRequest.send(data);
      }
      catch(e) {
        alert("La communication avec le fichier distant a \351chou\351. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
    		information.style.visibility = "hidden";
        return;
      }
      httpRequest.onreadystatechange = function() {
        if(httpRequest.readyState == 4 && httpRequest.status == 200) {
          var reponse = httpRequest.responseText;
          switch(reponse) {
    				case "1":
    	        alert("Le message a bien \351t\351 envoy\351, merci pour l'int\351r\352t que vous portez \340 ce site.");
      	      document.forms[0].titre.value        = "";
      	      document.forms[0].adresse.value      = "";
      	      document.forms[0].corps.value        = "";
    					document.forms[0].categorie.options[5].selected = true;
      	      document.forms[0].piece_jointe.value = "";
    					break;
    				case "2":
    	        alert("La pi\350ce jointe n'existe pas ou elle est trop volumineuse.");
    					break;
    				default:
    	        alert("Votre message n'a pu \352tre envoy\351. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
          }
          document.forms[0].titre.focus();
          information.style.visibility = "hidden";
          return;
        }
      }
    }

  2. #2
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    Moi j'utilise ca:
    coté php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    utf8_encode($text);
    coté javascript :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    decodeURIComponent(encodeURIComponent(text));

  3. #3
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Tout est encodé en utf-8 ? ou tu as une partie en utf-8 (par exemple les données de ta base) et d'autres encodages ailleurs (par exemple iso-8859-1 pour les pages comme souvent en France) ?

    Ensuite quand tu dis :
    Citation Envoyé par julieng31
    pas bien transmis
    --> pas bien transmis comment ? ( parce que des caractères "bizarres" il y en a quand pas mal de genres différents, qui peuvent suggérer des problèmes de natures également différentes ^^ )

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    J'ai remarqué que le JavaScript utilise l'encodage utf-8 par défaut :o et apparement il se moque des meta d'encodage de la page qui font l'objet d'un autre traitement probablement donc essaye en encodant tes caractère depuis php, normalement si tu utilise l'utf-8 partout tu n'as pas de probleme (aussi lors de la sauvegarde du fichier, on y fait pas gaffe en général)

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    Même avec de l'encodage utf-8 j'ai plein de soucis notamment avec les alert, confirm et toute la click.

    Le seul moyen que j'ai trouvé pour y remédier c'est d'utiliser l'écriture "octal" pour les caractèrs spéciaux -> genre \351 pour le é

    cela donne alert('H\351 toi !!');

  6. #6
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Il me semble que DoubleU a raison : as-tu essayé plutôt utf8_encode() dans ton php ?

  7. #7
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Merci pour toutes ces réponses, je n'avais pas accès à mon PC, je n'ai pas pu voir tout ce qui a été écrit avant.

    DoubleU & meliandah : je suis en train de tester.

    DoubleU : quel est l'intérêt de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decodeURIComponent(encodeURIComponent(text));
    car c'est appeler une fonction et son inverse donc ça revient, il me semble, à ne rien faire ?

    RomainVALERI : j'essaye d'utiliser l'UTF-8 le plus possible (le traitement PHP est déclaré en UTF-8, le mail est envoyé en tant que contenu UTF-8 et mon thunderbird l'est aussi). Par contre, je ne sais pas si je peux forcer le formulaire en UTF-8 et pour l'ajax, j'ai lu que c'était en UTF-8 (c'est peut être une fausse information). Quand je dis bizarre, c'est que chaque caractère accentué est remplacé par un losange noir contenant un point d'interrogation blanc.

    Saray : je le fais aussi pour les alert en javascript mais là, je souhaite le lire dans thunderbird en UTF-8.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Après quelques essais :
    * si dans mon PHP, au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $var = utf8_decode($_POST[var]);
    je fais uniquement
    Les caractères accentués sont remplacés par : é.

    * pas mieux avec utf8_encode plutôt que utf8_decode, j'ai les mêmes caractères qu'au départ.

    En fait, si on part du formulaire pour essayer de comprendre l'enchaînement, les données sont récupérées en javascript (var X = document.forms[0].X.value). Je n'ai pas trouvé de moyen de forcer cela en UTF-8. Quel est donc l'encodage obtenu ?

  9. #9
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Salut,

    Regardes aussi sur quoi est réglé l'encodage de ton navigateur.

  10. #10
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    Citation Envoyé par julieng31 Voir le message
    DoubleU : quel est l'intérêt de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decodeURIComponent(encodeURIComponent(text));
    car c'est appeler une fonction et son inverse donc ça revient, il me semble, à ne rien faire ?
    Je pensais comme toi au départ, mais en fait il semble que la fonction decodeURIComponent ne décode pas les caractères comme le "ç" par exemple, donc si tu en as une dans un chaine, elle sera tronquée à cet endroit. Utiliser encodeURIComponent avant permet d'encoder le "ç" pour permettre de décoder toute la chaine apres.

    Sinon, concernant le utf8_encode, moi je l'utilise juste au moment décrire le résultat dans la page et j'ai jamais eu de problème:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    echo json_encode(utf8_encode($text))

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Points : 52
    Points
    52
    Par défaut
    C'est assez rare, mais je suis tombé sur ce cas dans la programmation de mon système, où j'ai dû faire un double utf8_decode pour retrouver mes accents ...
    en fait la chaîne était passé par une fonction qui l'a transformé en utf-8 par l'intermédiaire d'Ajax et aussi par une fonction qui encodait en utf-8. La dernière fonction servant aussi pour le non ajax, je ne pouvais pas lui enlever son encodage utf8 -> sinon j'avais un problème d'accent ailleurs

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Points : 91
    Points
    91
    Par défaut
    Bonsoir,

    merci à tous ! Ca m'aide grandement.
    Effectivement, je suis arrivé au même constat que meliandah. Javascript encode en UTF-8. Je ne voulais pas le croire mais il semble bien.
    Du coup, les données que je récupère en $_GET sont à utf8_decode() côté PHP.
    Sinon, on insère en base des caractères exotiques

    Par contre, je n'ai pas besoin dans mon cas de encodeURIComponent.

    à+

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 16
    Points
    16
    Par défaut
    C'est marrant, j'ai jamais eu ce genre de problèmes, pourtant, je code toujours en utf8...

    Ceci dit, dans les codes énoncés en premier, j'ai vu l'apparition du utf8_decode mais pas du utf8_encode Oo (ou alors j'ai la berlue...)

    Sans vouloir poser un dogme absolu, il me semble que utf8_encode et utf8_decode sont un peu des jumelles, si on se sert d'un, il faut se servir de l'autre, sinon, ca fait ds trucs bizarres... Enfin bref apparemment le problème est résolu !

Discussions similaires

  1. [AJAX] caractéres speciaux avec ajax
    Par bylka dans le forum AJAX
    Réponses: 2
    Dernier message: 24/06/2009, 15h16
  2. [AJAX] Caractères speciaux avec responseText
    Par aztec dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/10/2008, 18h50
  3. [AJAX] Caractères accentués remplacés
    Par Mister Nono dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/07/2007, 13h20
  4. [AJAX] Caractères bizarres avec AJAX
    Par davinout dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 02/04/2007, 22h33
  5. [AJAX] Caractères accentués dans un responseXML
    Par Herode dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/12/2006, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo