[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:
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ème du message :</p>
<select name="categorie" size="1">
<option>Probléme d'affichage</option>
<option>Accessibilité</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) :</p>
<input name="adresse" type="text" maxlength="70" />
<p>Contenu (limité à 5000 caractères) :</p>
<textarea name ="corps"
rows ="10"
onkeyup="javascript:limite_taille(this);"></textarea>
<p>Pièce jointe (taille limitée à 5Mo) :</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:
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:
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;
}
}
} |