Envoi d'un formulaire PHP en chinois

Eléphanteau du PHP | 10 Messages

13 avr. 2013, 08:36

Bonjour à tous,

Je bloque sur un problème d'encodage de caractères dans un formulaire PHP. Il s'agit d'un formulaire destiné à un public chinois et qui sera donc rempli dans cette langue. Mais quand je reçois le message dans ma boîte email, je ne reçois en lieu et place des caractères des signes du genre : ÄãºÃ

Une idée comment résoudre le problème ? Voici le code complet de ma page de traitement :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>谢谢 !</title>
</head>
<body bgcolor="#000000">
<p align="center">&nbsp;</p>
<p align="center"><font color="#FFFFFF"><img src="images/maisonming.jpg" alt="wannan" width="235" height="241" border="1" /></font></p>
<p align="center">&nbsp;</p>
<p align="center"><font color="#FFFFFF" size="4" face="Verdana, Arial, Helvetica, sans-serif"><strong><br>
 
<?
            
$nom = $_POST['nom']; 
$ville = $_POST['ville']; 
$tel = $_POST['tel']; 
$email = $_POST['email'];
$commentaire = $_POST['commentaire'];

//On affiche ici les informations saisie
echo "谢谢<br>";

$commentaire = stripslashes($commentaire);

//On envoit un mail contenant les données
mail("[email protected]","Contact Chawu CN","Coordonees : \n$nom\n$ville\n$tel\n\n$email\n\nCommentaire :\n$commentaire","From: $email\nReply-To: $email"); 

?>
</strong></font></p>
<p align="center">&nbsp;</p>
<p align="center"><font color="#FFFFFF">
  <input type="button" value="回去" name="Pr&eacute;c&eacute;dente" onclick="history.back()" />
</font></p>
</body>
</html>

Eléphant du PHP | 267 Messages

13 avr. 2013, 09:42

quand tu ouvres un mail, c'est bien le jeu de caractères utf-8 qui est utilisé ?

Eléphanteau du PHP | 10 Messages

13 avr. 2013, 09:48

Bien joué, si je sélectionne l'encodage unicode uft 8 ça marche pas, mais si je sélectionne pour le GB 2312 (chinois simplifié), ça marche ! Merci.
Par contre y'a pas moyen d'inclure dans l'entête du mail reçu qu'il s'agit d'un email en chinois ? Ainsi mon logiciel de mail pourrait le lire directement.

Eléphant du PHP | 418 Messages

13 avr. 2013, 10:23

Salut,

Oui bien sur que tu peux

Regarde sur cet exemple
$message = $_POST['message'];

$headers = 'From: '.$pseudo.' <'.$email.'>'."\n";
$headers .= 'Return-Path: <'.SITE_MAIL.'>'."\n";
$headers .= 'MIME-Version: 1.0'."\n"; 
$headers .= 'Content-Type: text/html; charset="utf-8"'."\n";
$headers .= 'Content-Transfer-Encoding: 8bit'."\n\n";

$subject = "Envoie d'email ......";

if(mail($email, $subject, $message, $headers)) {
    // mail partis
}
else{
    // mail pas partis
}
Il te suffit de remplacer $headers .= 'Content-Type: text/html; charset="utf-8"'."\n"; par l'encodage souhaité.

Mais normalement UTF-8 devrais pouvoir afficher du Chinois.
C'est sensé être un encodage universel.
J'avais envoyer des email en Arabe, et ça me les à bien encodé.
Après faut voir, je ne suis pas expert ;-)

En espérant que ça peux t'aider

Cordialement

Eléphanteau du PHP | 10 Messages

13 avr. 2013, 10:45

Merci pour cette indication, je sens désormais que je brule. Ca ne marche pas mais certainement que je n'ai pas placer $headers .= 'Content-Type: text/html; charset="GB2312"'."\n"; au bon endroit...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>谢谢 !</title>
</head>
<body bgcolor="#000000">
<p align="center">&nbsp;</p>
<p align="center"><font color="#FFFFFF"><img src="images/maisonming.jpg" alt="wannan" width="235" height="241" border="1" /></font></p>
<p align="center">&nbsp;</p>
<p align="center"><font color="#FFFFFF" size="4" face="Verdana, Arial, Helvetica, sans-serif"><strong><br>
 
<?
            
$nom = $_POST['nom']; 
$ville = $_POST['ville']; 
$tel = $_POST['tel']; 
$email = $_POST['email'];
$commentaire = $_POST['commentaire'];

$headers .= 'Return-Path: <'.SITE_MAIL.'>'."\n";
$headers .= 'MIME-Version: 1.0'."\n"; 
$headers .= 'Content-Type: text/html; charset="GB2312"'."\n";
$headers .= 'Content-Transfer-Encoding: 8bit'."\n\n";

//On affiche ici les informations saisie
echo "谢谢<br>";

$commentaire = stripslashes($commentaire);

//On envoit un mail contenant les données
mail("[email protected]","Contact Chawu CN","Coordonees : \n$nom\n$ville\n$tel\n\n$email\n\nCommentaire :\n$commentaire","From: $email\nReply-To: $email"); 

?>
</strong></font></p>
<p align="center">&nbsp;</p>
<p align="center"><font color="#FFFFFF">
  <input type="button" value="回去" name="Pr&eacute;c&eacute;dente" onclick="history.back()" />
</font></p>
</body>
</html>

Eléphant du PHP | 418 Messages

13 avr. 2013, 10:54

SITE_MAIL, c'est une constante que j'avais défini (j'ai omis de la changer)

Ensuite ta ligne " mail("[email protected]","Contact Chawu CN","Coordonees : \n$nom\n$ville\n$tel\n\n$email\n\nCommentaire :\n$commentaire","From: $email\nReply-To: $email"); " peux être largement simplifié, ça sert à ça les $headers.
Fait comme je t'es montré dans l'exemple plus haut, en remplaçant comme montré précédemment, tu vas toi même te simplifier la tache, vu que tu créer des variables avec les valeurs souhaités, que tu injecte directement dans la fonction mail();
mail($email, $subject, $message, $headers)

Ensuite, je vois pas, mis à part que ta page est en UTF-8 donc les données traitées risquent de ne pas avoir le bon encodage, je vois pas d'autre choses.
Essaye d'envoyer ton email en UTF-8, pense aussi à encoder la page que tu développe ( la page qui contient le code ;-) ) en UTF-8 sans BOM

Eléphant du PHP | 418 Messages

13 avr. 2013, 11:13

Je rajoute une infos importante

N’envoie jamais , que ça soit par email ou en BDD, des données venues d'un formulaire, sans les traitées au préalable.

Ca peux paraitre bête, mais on peux se faire avoir comme ça, surtout avec le genre de requête injectées.

Pense au moins a faire htmlentities():
$nom = htmlentities($_POST['nom']);
$ville = htmlentities($_POST['ville']);
$tel = htmlentities($_POST['tel'];
$email = htmlentities($_POST['email']);
$commentaire = htmlentities($_POST['commentaire']);
Pour afficher les données venues d'une BDD tu fait html_entity_decode() " $commentaire = html_entity_decode($res['commentaire']); "

Tu as aussi htmlspecialchars()

Et évite les short tags, certains serveur ne sont pas configurés pour, tu risque d'avoir des soucis.
<?php echo "3 lettres c'est pas la mort pour éviter un suicide ^^"; ?>
Cordialement

Eléphanteau du PHP | 10 Messages

13 avr. 2013, 11:29

merci à tous !