PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 17-11-2013 12:50:19

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

[Résolu] codage UTF-8 entre le formulaire et le mail de réception

Bonjour,
Je n'ai pas assez de connaissance en PHP pour résoudre mon problème.
J'ai un script qui permet de laisser un commentaire sur mon site. il est très simple et me convient parfaitement. Il utilise juste un fichier texte qui contient les commentaires.
Tout allait bien jusqu'à ce qu je décide de coder mes page en UFT8 donc dans l'entête de ma page html


<meta charset="utf-8">

le commentaire est parfaitement publié sur la page au niveau des accents. Le fichier texte qui contient les commentaires comporte les accents et non le caractères ascii du genre &eacute;.
Mon problème se situe au niveau du mail que je reçois. Les caractères accentués ne s'affichent pas correctement et sont donc remplacés par exemple pour Gérard par Gérard .
que devrais-je modifier pour que la mail affiche bien les caractères accentués ?
merci pour votre aide
Gérard
voici le code complet (en plus, ça peut servir à ceux qui cherche un script du genre)


<?php
//*************************
 //Définitions des variables
 //*************************
 
 $debug = 1; //0=off / 1=on
 $notification_mail = 1; //0=non / 1=oui
 $adresse_mail = "monmail@moi.com";
 $provenance_mail = "From: mon site";
 
 
 // Recupere le pseudo
 $pseudo = $_POST['pseudo'];
 //Récupère le commentaire
 $commentaire = $_POST['commentaire'];

 //Extrait le nom de la page et l'utilise pour le nom du fichier de sauvegarde en ".txt"
 $script_name = $_SERVER['SCRIPT_NAME'];
 $pos = strrpos($script_name, "/");
 $path = substr($script_name, $pos+1, strlen($script_name) - $pos - 5).'.txt';
 
 
  //Affichage du formulaire
 
 
 //Enregistre et affiche les commentaires
 if(isset($_POST['submit']))
  save_comment($path,$pseudo,$commentaire);
 else
 //Affiche les commentaires
   if(file_exists($path))
      echo affiche_commentaires($path);  
 

 //*********
 //Fonctions
 //*********

 function affiche_commentaires($path)
 {
  global $debug;
 
 
  $handletmp = fopen($path,"r");
  $tableau_content = file($path);
  fclose($handletmp);
     
  //***************************
  //Affichage des commmentaires  
  //***************************
 
  // boucle sur tous les elements
  $HTML  = '<div class="title-com-wrapper">Vos commentaires</div>';
 
  for($i=0; $i < count($tableau_content); $i++)
  {
    if($i%2==0)
      {
       $HTML .= '<div class="user-wrapper">';
       $HTML .= $tableau_content[$i].'</div>';
      }
    else
     {
       $HTML .= '<div class="com-user-wrapper">';
       $HTML .= $tableau_content[$i].'</div>';
     }
  }
  $HTML .= '</div>';
 
  return $HTML;
 }
 
 
 function save_comment($path,$pseudo,$commentaire)
  {
 
   //*****************************
   //Enregistrement du commentaire  
   //*****************************
   
   global $debug;
   global $notification_mail;
   
 
   global $adresse_mail;
   global $provenance_mail;
 
   if(file_exists($path))
     {
      $handle = fopen($path,"r");
      $tableau_content = file($path);
      fclose($handle);  
     }
   //remplace le retour à la ligne par
et le \' par '
   $commentaire=eregi_replace("\r\n","
",$commentaire);
   $commentaire=eregi_replace("\\\'","'",$commentaire);  

   if(($commentaire != "")&&(($commentaire . "\r\n") != $tableau_content[count($tableau_content)-1]))
     {
      $handle = fopen($path,"w");
      for($i=0;$i < count($tableau_content); $i++)
         {  
          if(($tableau_content[$i] != "")&&($tableau_content[$i] != "\r\n"))
          fwrite($handle,$tableau_content[$i]);
         }    
      $str_out = '<span class="post-pseudo-style">' .$pseudo." </span> le ".date('d.m.y - H:i:s')."\r\n".$commentaire."\r\n";
      fwrite($handle,$str_out);  
      fclose($handle);
      if($notification_mail == 1)
        {
         $message = $pseudo." le ".date('d.m.y - H:i:s')."\r\n".$commentaire."\r\nhttp://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
         mail($adresse_mail,"Nouveau commentaire de ".$pseudo,$message,$provenance_mail);
        }
     }
   else
    {
     if($debug == 1)
      echo "

Commentaire vide ou redondant!!!
";  
     }  
   echo Affiche_commentaires($path);
 }
 echo '
 <div id="conteneur">
  <div class="title-post-wrapper">Laisser un commentaire</div>
 <form enctype="multipart/form-data" name="comment_form" action="'.$_SERVER['PHP_SELF'].'" method="POST">
 <label class="pseudo-style" for="pseudo-box">Pseudo : </label>

            <input type="text" name="pseudo" class="pseudo-box" value="'.$pseudo.'" placeholder="Entrez votre pseudo">

 <label class="com-style">Votre commentaire :</label>

            <textarea name="commentaire" cols="50" rows="5" class="com-box" placeholder="Entrez votre commentaire - 5 lignes maxi..."></textarea>
         </textarea>

 <input class="button-style" type="submit" name="submit" value="Poster" />
 </form>
 ';
?>
 

Dernière modification par Gaeil28 (21-11-2013 10:37:39)

Hors ligne

#2 19-11-2013 07:32:47

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Bonjour,

Il vous faut préciser dans l'entête de votre mail l'encodage utilisé pour son contenu.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 19-11-2013 10:15:39

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

bonjour,

oui depuis mon post j'ai essayé pas mal de choses pour coder le mail comme par exemple

$headers = "From:  <contact@monsite.com> \r\n";
$headers ;= 'Content-Type: text/plain; charset=UTF-8; format=flowed;';
$headers . = 'MIME-Version: 1.0';
$headers .= 'Content-Transfer-Encoding: 8bit';

et ensuite

mail($adresse_mail,"Nouveau commentaire de ".$pseudo,$message,$provenance_mail,$headers);

ou "plus simple"

$entete = 'MIME-Version: 1.0' . "\r\n";
$entete .= 'Content-type: text/plain; charset=utf-8' . "\r\n";

et ensuite

mail($adresse_mail,"Nouveau commentaire de ".$pseudo,$message,$provenance_mail,$entete);

mais rien dans ces essais ne fonctionne (je veux dire que je reçois toujours le mail sans les caractères accentués... Gérard  au lieu de Gérard.)
c'est vraiment bizarre, car si j'exécute ce script avec un include dans un fichier html/php classique (non codé en UTF8, ça fonctionne...
mais là je l'exécute à partir d'une page html/php dont l'entête précise

<meta charset="utf-8">

et c'est là que ça ne fonctionne plus...
histoire de fou ? roll


Gérard

Hors ligne

#4 19-11-2013 11:18:39

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Bonjour,

Tout simplement parce qu'il ne suffit pas de dire qu'une page est encodée en UTF-8 pour qu'elle le soit wink
Il faut de plus que cette déclaration d'environnement d'encodage soit déclarée au niveau de votre php.ini pour que php interprète le contenu avec le bon encodage. Cela vous fait donc 3 points à vérifier.
Pour ce qui est de cette vérification au niveau de votre fichier, prenez un simple applicatif comme Notepad++ et réenregistrez votre fichier en UTF-8 sans BOM.
Pour ce qui est de votre encodage entête mail je vous conseillerais plutôt d'encoder en text/html plutôt que text/plain et de préciser l'encodage de transmission pour plus de stabilité comme suit:


    $headers.="Content-type:text/html; charset=\"utf-8\"\r\n";
    $headers.= "Content-Transfert-Encoding:8bit\r\n";
 

Pensez à marquer le sujet comme résolu à la fin wink
++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 19-11-2013 15:29:05

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Bonjour,
OK merci.
en fait c'est vrai qu'il y a un peu tout et n'importe quoi au niveau encodage des différents fichiers. Certains sont utf8, d'autres en ANSI...
il faut donc que je reprenne calmement mon code...:/

question 1

Bien qu'ayant lu pas mal de conseils sur l'encodage (ou le codage ?) des caractères, j'ai du mal à comprendre.:(
en supposant que le serveur interprète bien du utf8 (par exemple grâce à une instruction dans le php.ini)
pour un fichier "normal" en HTML5
Si je mets en en tête une instruction du genre

<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />
  <title>Mon titre</title>

est-ce que je peux mettre directement des accents dans les balises et le texte mon fichier, par exemple

<title> Mon été à la campagne</title>

ou dois mettre  ?

<title> Mon &eacute;t&eacute; &agrave; la campagne</title>

question 2
J'ai codé le script commentaires.php en utf8 sans BOM (via Notepad ++)
j'ai ajouté

 $headers = "De : MonSite";
 $headers.="Content-type:text/html; charset=\"utf-8\"\r\n";
$headers.= "Content-Transfert-Encoding:8bit\r\n";

.....et un peu plus bas
mail($adresse_mail,"Nouveau commentaire de ".$pseudo,$message,$provenance_mail,$headers);
 

J'ai codé (via notepad ++) le fichier php qui contient le script en utf8 sans BOM
avec en en-tête

!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />  <title>Mon titre</title>
.....
puis
<?php include("commentaires.php"); ?>
.....
</html>

 

J'ai mis à la racine du site un php.ini qui contient les infos suivantes (il est complet ci-dessous)

mbstring.language=UTF-8
mbstring.internal_encoding= UTF-8
mbstring.http_input=UTF-8
mbstring.http_output=UTF-8
mbstring.detect_order= auto
mbstring.func_overload = 1

et bien c'est toujours pareil..voici l'en-tête du mail que je reçois
X-Amavis-Alert: BAD HEADER SECTION, Non-encoded 8-bit data (char C3 hex):
donc je ne vois pas....

merci
Gérard

Dernière modification par Gaeil28 (19-11-2013 16:59:04)

Hors ligne

#6 20-11-2013 02:33:22

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Bonjour,

Pour répondre à votre première question oui.
En ce qui concerne la configuration de php, commentez (désactivez) les directives mbstring vous n'en avez pas besoin.
Relancez apache, et essayez à nouveau wink


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 20-11-2013 10:39:35

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

merci.
oui effectivement j'ai remplacé par cette seule ligne (plus appropriée) dans le php.ini

default_charset = "utf-8"

j'ai aussi été voir cet excellent tuto (et suivi les préconisations à la lettre..)
OpenClassroom

Le problème n'est pas résolu, ....
car le fichier exécuté seul (donc sans aucune instruction html de codification) ça marche. le bazard c'est quand on commence à mettre les entêtes HTML

<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />  <title>Mon titre</title>
</head>
<body>
// ici le code du script php seul
<?php ......?>
</body>
</html>
 

ça donne dans le mail

Gérard le 20.11.13 - 09:59:59
commentaire de réponse fichier gchtml.php

dans le tuto il y a comme "consigne"

"é", "î", "Ã" etc. => la chaine de caractères est encodée en UTF-8 mais le navigateur croit avoir affaire à de l'ISO-8859-1 (probablement parce que votre page dit au navigateur qu'elle utilise l'ISO-8859-1). Utilisez la fonction utf8_decode sur la chaine de caractères posant problème si elle est issue d'une variable PHP.

il faudrait pour cela que je code comme indiqué les variables destinées au mail..
bon je vais creuser...
Gérard


merci pour toutes ces infos.

Hors ligne

#8 20-11-2013 10:57:56

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Bonjour,

Concernant l'entête au niveau html la bonne écriture c'est


<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="fr-fr" http-equiv="Content-Language" >
 

Cordialement,

Jc


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 20-11-2013 14:32:16

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

au fait...la réponse oui, n'est pas claire...

Jc a écrit :

Bonjour,

Pour répondre à votre première question oui.
En ce qui concerne la configuration de php, commentez (désactivez) les directives mbstring vous n'en avez pas besoin.
Relancez apache, et essayez à nouveau wink


oui je suis obligé de mettre &eacute; ou oui je dois mettre é  ?
merci

Hors ligne

#10 20-11-2013 15:06:25

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Jc a écrit :

Bonjour,

Concernant l'entête au niveau html la bonne écriture c'est


<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta content="fr-fr" http-equiv="Content-Language" >
 

Cordialement,

Jc

Moi je veux bien, vu que je ne suis pas un spécialiste, mais alors que pensez de ça ?
Openclassroom Codage d'une page

Dernière modification par Gaeil28 (20-11-2013 15:06:57)

Hors ligne

#11 20-11-2013 23:53:27

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Que penser de ça?

Que c'est juste un tuto minimaliste de première approche qui explique les bases. Il ne tient pas compte du standard à 100%.

Avez-vous essayé et regardé si votre problème est résolu? Avez-vous bien redémarré votre serveur apache après vos modifications dans votre php.ini?

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#12 21-11-2013 10:37:05

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Bonjour, et merci pour vos conseils et aides diverses.

merci
Gérard

Dernière modification par Gaeil28 (21-11-2013 10:48:46)

Hors ligne

#13 23-11-2013 03:32:01

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : [Résolu] codage UTF-8 entre le formulaire et le mail de réception

Pour la réponse c'est oui=é wink


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums