Problème avec les accents dans le formulaire de contact

cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   -  
cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour

Depuis que j'ai convertis tous mes fichiers php en UTF8 j'ai un problème avec mon formulaire de contact.
En effet, si les messages envoyés contiennent des accents ça m'envoie quelque chose qui ressemble à "'(-è_èè-('
Ma page de contact http://www.fan-de-mixmaster.legtux.org/formulaire_contact.php est composée d'un fichier contact.php inclus dans un fichier formulaire_contact.php

Voici le code du fichier contact.php :

<?php
/*
	********************************************************************************************
	CONFIGURATION
	********************************************************************************************
*/
// destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule
$destinataire = (ici j'ai volontairement enlevé mon adresse mail);

// copie ? (envoie une copie au visiteur)
$copie = 'oui';

// Action du formulaire (si votre page a des paramètres dans l'URL)
// si cette page est index.php?page=contact alors mettez index.php?page=contact
// sinon, laissez vide
$form_action = '';

// Messages de confirmation du mail
$message_envoye = "<center>Votre message m'est bien parvenu ! Une réponse vous sera envoyée sous 48 heures. <br/><br/><img src='img_diverses/apres_envoie_message.jpg'> </center> ";
$message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer SVP.";

// Message d'erreur du formulaire
$message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur.";

/*
 * NoSpamQuestion affiche une question pour la validation d'un formulaire ...
 * $mode, mode question ou réponse par défaut tirage au sort de question {string}
 * $answer, lors de la demande d'une réponse à la question numero tant ... {int}
 *
 * @returns array
 *
 * Ajouter une question :
 * copier/coller ces lignes et remplir le contenu entre guillemets doubles :
 *
 * $array_pictures[$j]['num'] = $j; // ne pas changer cette ligne
 * $array_pictures[$j]['question'] = "mettre ici la question (correspondant à l'image si vous utilisez une image)";
 * $array_pictures[$j]['answer'] = "mettre ici la réponse à l'énigme";
 * $j++; // ne pas oublier cette ligne dans la copie :-)
 *
 * C'est tout. Question suivante ? :-)
 *
 */
function NoSpamQuestion($mode = 'ask', $answer = 0)
{
	$array_pictures = array(); $j = 0;

	$array_pictures[$j]['num'] = $j;
	$array_pictures[$j]['question'] = "Quelle est la cinquième lettre du mot Astux ?";
	$array_pictures[$j]['answer'] = "x";
	$j++;
	
	$array_pictures[$j]['num'] = $j;
	$array_pictures[$j]['question'] = "Ecrivez le mot 'arbre' sans guillemets";
	$array_pictures[$j]['answer'] = "arbre";
	$j++;
	
	$array_pictures[$j]['num'] = $j;
	$array_pictures[$j]['question'] = "Recopier ce nombre : 1200";
	$array_pictures[$j]['answer'] = "1200";
	$j++;

	if ($mode != 'ans')
	{
		// on est en mode 'tirer au sort', on tire une image aléatoire
		$lambda = rand(0, count($array_pictures)-1);
		return $array_pictures[$lambda];
	}
	else
	{
		// on demande une vraie réponse
		foreach($array_pictures as $i => $array)
		{
			if ($i == $answer)
			{
				return $array;
				break;
			};
		};
	}; // Fin if ($mode != 'ans')
};
/*
	********************************************************************************************
	FIN DE LA CONFIGURATION
	********************************************************************************************
*/
	// on tire au sort une question
	$nospam = NoSpamQuestion();

/*
 * cette fonction sert à nettoyer et enregistrer un texte
 */
function Rec($text)
{
	$text = htmlspecialchars(trim($text), ENT_QUOTES);
	if (1 === get_magic_quotes_gpc())
	{
		$text = stripslashes($text);
	}

	$text = nl2br($text);
	return $text;
};

/*
 * Cette fonction sert à vérifier la syntaxe d'un email
 */
function IsEmail($email)
{
	$value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\'\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\'\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
	return (($value === 0) || ($value === false)) ? false : true;
}

// formulaire envoyé, on récupère tous les champs.
$nom        = (isset($_POST['nom']))        ? Rec($_POST['nom'])        : '';
$email      = (isset($_POST['email']))      ? Rec($_POST['email'])      : '';
$objet      = (isset($_POST['objet']))      ? Rec($_POST['objet'])      : '';
$message    = (isset($_POST['message']))    ? Rec($_POST['message'])    : '';
$antispam_h = (isset($_POST['antispam_h'])) ? Rec($_POST['antispam_h']) : '';
$antispam_r = (isset($_POST['antispam_r'])) ? Rec($_POST['antispam_r']) : '';

// On va vérifier les variables et l'email ...
$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré
$err_formulaire = false; // sert pour remplir le formulaire en cas d'erreur si besoin

if (isset($_POST['envoi']))
{
	// On demande la vraie réponse
	$verif_nospam = NoSpamQuestion('ans', $antispam_r);

	if (strtolower($antispam_h) != strtolower($verif_nospam['answer']))
	{
		// le formulaire s'arrête ici
		echo '<p>Vous n\'avez pas répondu correctement à la question Antispam ...</p>';
	}
	else
	{
		if (($nom != '') && ($email != '') && ($objet != '') && ($message != ''))
		{
			// les 4 variables sont remplies, on génère puis envoie le mail
			$headers  = 'From:'.$nom.' <'.$email.'>' . "\r\n";
			//$headers .= 'Reply-To: '.$email. "\r\n" ;
			//$headers .= 'X-Mailer:PHP/'.phpversion();

			// envoyer une copie au visiteur ?
			if ($copie == 'oui')
			{
				$cible = $destinataire.','.$email;
			}
			else
			{
				$cible = $destinataire;
			};

			// Remplacement de certains caractères spéciaux
			$message = str_replace("'","'",$message);
			$message = str_replace("’","'",$message);
			$message = str_replace(""",'"',$message);
			$message = str_replace('<br>','',$message);
			$message = str_replace('<br />','',$message);
			$message = str_replace("<","<",$message);
			$message = str_replace(">",">",$message);
			$message = str_replace("&","&",$message);

			// Envoi du mail
			if (mail($cible, $objet, $message, $headers))
			{
				echo '<p>'.$message_envoye.'</p>';
			}
			else
			{
				echo '<p>'.$message_non_envoye.'</p>';
			};
		}
		else
		{
			// une des 3 variables (ou plus) est vide ...
			echo '<p>'.$message_formulaire_invalide.'</p>';
			$err_formulaire = true;
		};
	};
}; // fin du if (!isset($_POST['envoi']))

if (($err_formulaire) || (!isset($_POST['envoi'])))
{
	// afficher le formulaire
	echo '
	<form id="contact" method="post" action="'.$form_action.'">
	<fieldset><legend>Vos coordonnées</legend>
		<p><label for="nom">Nom : </label><input type="text" id="nom" name="nom" value="'.stripslashes($nom).'" tabindex="1" /></p>
		<p><label for="email">Email : </label><input type="text" id="email" name="email" value="'.stripslashes($email).'" tabindex="2" /></p>
	</fieldset>

	<fieldset><legend>Votre message :</legend>
		<p><label for="objet">Objet :      </label><input type="text" id="objet" name="objet" value="'.stripslashes($objet).'" tabindex="3" /></p>
		<p><label for="message">Message : </label><textarea id="message" name="message" tabindex="4" cols="55" rows="15">'.stripslashes($message).'</textarea></p>
	</fieldset>

	<fieldset><legend>Antispam</legend>
	Ecrire la réponse sans majuscule ni accent.
		<p><label for="antispam_h">'.$nospam['question'].'</label> <input type="text" name="antispam_h" id="antispam_h" /> <input type="hidden" name="antispam_r" value="'.$nospam['num'].'" /></p>
	</fieldset>

	<div style="text-align:center;"><input type="submit" name="envoi" value="Envoyer le formulaire !" /></div>
	</form>';
};
?>


Remarque : J'ai enlevé presque toutes les questions anti spam afin de raccourcir le code que j'envoie ici.

Merci de votre aide.
A voir également:

5 réponses

ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
'lut, tout va bien tant que c'est sur ton site: UTF8+UTF8=pas de problèmes.
Mais les mails sont envoyés par défaut dans le charset ISO-8859-1, il faut donc préciser l'encodage (en supposant que tes mails sont faits uniquement de texte brut):
$nom = "=?UTF-8?B?".base64_encode($nom)."?=";
$objet = "=?UTF-8?B?".base64_encode($objet)."?=";
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers  .= 'From:'.$nom.' <'.$email.'>' . "\r\n";
$headers  .= 'Content-Type: text/plain; charset=UTF-8;' . "\r\n";
...

from human import idiocy
del idiocy
0
cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   145
 
Ah bon c'est envoyé au format iso, comment avez vous vu cela ?

J'ai mis votre code dans la page mais ça me donne
Parse error: syntax error, unexpected '$headers' (T_VARIABLE) in /var/www/legtux.org/users/fan-de-mixmaster/contact.php on line 216

Je vous met le passage concerné :

  if (($nom != '') && ($email != '') && ($objet != '') && ($message != ''))
{
// les 4 variables sont remplies, on génère puis envoie le mail
$headers = 'From:'.$nom.' <'.$email.'>' . "\r\n";
//$headers .= 'Reply-To: '.$email. "\r\n" ;
//$headers .= 'X-Mailer:PHP/'.phpversion();
$nom = "=?UTF-8?B?".base64_encode($nom)."?=";
$objet = "=?UTF-8?B?".base64_encode($objet)."?=";
$headers = 'MIME-Version: 1.0' . "\r\n"
$headers .= 'From:'.$nom.' <'.$email.'>' . "\r\n";
$headers .= 'Content-Type: text/plain; charset=UTF-8;' . "\r\n";

// envoyer une copie au visiteur ?
if ($copie == 'oui')
{
$cible = $destinataire.','.$email;
}

J'ai souligné la ligne 216
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
J'ai raté un
;
sur la première ligne d'
$headers
. Et ce code est censé remplacer le code actuel: il faut supprimer la première ligne
$headers  = 'From:'.$nom.' <'.$email.'>' . "\r\n";
avant les
$nom =
et
$objet =
, sinon il y aura un en-tête en double.
"comment avez vous vu cela": le format basique des mails défini par la RFC5322 ne définit pas d'encodage particulier ("Note" du §1.1) mais la grande majorité des clients mails interprètent encore les mails en ISO-8859-1 par défaut pour des raisons historiques.
0
cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   145
 
Pour tester, j'ai envoyé un message en marquant dans le champ nom &é"'(-è_çà)= puis dans objet et dans message j'ai aussi marqué &é"'(-è_çà)=

Résultat :
Pour le mail envoyé sur mon adresse en legtux.org
Le corps du mail : &é"'(-è_çà)=
Donc c'est bon.

L'objet du mail : &*a*mp;é&*quot;&*#*03*9;(-è_çà)= (j'ai rajouté des étoiles car CCM remplace ce charabia par les bons caractères.
Donc il y a un soucis mais seulement avec certains caractères.

Ensuite dans le champ email j'ai marqué une adresse hotmail.fr m'appartenant.

Dans le corps du mail je vois ça :

From:=?UTF-8?B?JmFtcDvDqSZxdW90OyYjMDM5Oygtw6hfw6fDoCk9?= <mon adresse@hotmail.fr>
Content-Type: text/plain; charset=UTF-8;
Message-Id: <je préfère le cacher @mail.legtux.org>
Date: Wed, 2 Jul 2014 13:27:08 +0200 (CEST)
Return-Path: postmaster@legtux.org
X-OriginalArrivalTime: 02 Jul 2014 11:27:09.0769 (UTC) FILETIME=[8FFCBB90:01CF95E8]

&é"'(-è_çà )=

Donc le corps du mail supporte pas les accents lorsque je consulte mes mails dans Windows Live Mail mais je devrais songer à prendre un autre logiciel car celui-là n'est plus maintenu à jour depuis longtemps.
Lorsque je consulte le mail depuis le site de Outlook, le corps c'est bon mais pas l'objet du mail.

Bon c'est un peu compliqué tout ça mais avant l'encodage que j'avais avant tout fonctionnait parfaitement et ça fait moche les -è_çà à la place des accents.
0
cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   145
 
Afin d'y voir plus clair, j'ai décidé d'installer Mozilla Thunderbird et de consulter mes mails dessus à la place d'utiliser Windows Live Mail qui est largement dépassé.

Je suis allé sur la page du formulaire de contact et j'ai fais 2 tests.

Premier :
Envoie d'un message en mettant une adresse @orange.fr dans le formulaire.

Résultat :
Que le mail soit lut depuis le site orange.fr ou depuis Mozilla Thunderbirds, ni le nom-prénom, ni l'objet ni le corps du mail n'affichent correctement les accents dans la copie du mail envoyée à l'adresse indiquée dans le formulaire.

Deuxième :
Envoie d'un message en mettant une adresse @hotmail.fr dans le formulaire.

Résultat :
Pour la consultation de la copie du mail envoyée, via le site de outlook le corps c'est ok mais pas l'objet. Pour la consultation via Mozilla Thunderbird, même soucis.

A noter que dans tous les cas, dans le mail envoyé à mon adresse @legtux.org, c'est à dire le seul envoyé si je désactive l'envoie de la copie du message, l'objet des mails a le problème avec les accents mais jamais le corps, qu'on ait marqué une adresse @hotmail ou @orange dans le formulaire.


Je pense que le plus logique serait de chercher un autre formulaire de contact mais celui-ci est vraiment très simple à utiliser, ne nécessite pas une dizaine de fichier comme c'est le cas pour certains formulaires et en plus les questions anti spam sont personnalisables.

Avez vous une idée de ce qu'on pourrait faire ?

Pour rappel, voici le code du fichier contact.php utilisé pour les tests :

<?php
/*
 ********************************************************************************************
 CONFIGURATION
 ********************************************************************************************
*/
// destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule
$destinataire = *******

// copie ? (envoie une copie au visiteur)
$copie = 'oui';

// Action du formulaire (si votre page a des paramètres dans l'URL)
// si cette page est index.php?page=contact alors mettez index.php?page=contact
// sinon, laissez vide
$form_action = '';

// Messages de confirmation du mail
$message_envoye = "<center>Votre message m'est bien parvenu ! Une réponse vous sera envoyée sous 48 heures. <br/><br/><img src='img_diverses/apres_envoie_message.jpg'> </center> ";
$message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer SVP.";

// Message d'erreur du formulaire
$message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur.";

/*
 * NoSpamQuestion affiche une question pour la validation d'un formulaire ...
 * $mode, mode question ou réponse par défaut tirage au sort de question {string}
 * $answer, lors de la demande d'une réponse à la question numero tant ... {int}
 *
 * @returns array
 *
 * Ajouter une question :
 * copier/coller ces lignes et remplir le contenu entre guillemets doubles :
 *
 * $array_pictures[$j]['num'] = $j; // ne pas changer cette ligne
 * $array_pictures[$j]['question'] = "mettre ici la question (correspondant à l'image si vous utilisez une image)";
 * $array_pictures[$j]['answer'] = "mettre ici la réponse à l'énigme";
 * $j++; // ne pas oublier cette ligne dans la copie :-)
 *
 * C'est tout. Question suivante ? :-)
 *
 */
function NoSpamQuestion($mode = 'ask', $answer = 0)
{
 $array_pictures = array(); $j = 0;

 $array_pictures[$j]['num'] = $j;
 $array_pictures[$j]['question'] = "Quelle est la cinquième lettre du mot Astux ?";
 $array_pictures[$j]['answer'] = "x";
 $j++;

 $array_pictures[$j]['num'] = $j;
 $array_pictures[$j]['question'] = "Quelle est la deuxième lettre du mot 'plante' ?";
 $array_pictures[$j]['answer'] = "l";
 $j++;

 $array_pictures[$j]['num'] = $j;
 $array_pictures[$j]['question'] = "Recopier ce nombre : 154 ";
 $array_pictures[$j]['answer'] = "154";
 $j++;

 if ($mode != 'ans')
 {
  // on est en mode 'tirer au sort', on tire une image aléatoire
  $lambda = rand(0, count($array_pictures)-1);
  return $array_pictures[$lambda];
 }
 else
 {
  // on demande une vraie réponse
  foreach($array_pictures as $i => $array)
  {
   if ($i == $answer)
   {
    return $array;
    break;
   };
  };
 }; // Fin if ($mode != 'ans')
};
/*
 ********************************************************************************************
 FIN DE LA CONFIGURATION
 ********************************************************************************************
*/
 // on tire au sort une question
 $nospam = NoSpamQuestion();

/*
 * cette fonction sert à nettoyer et enregistrer un texte
 */
function Rec($text)
{
 $text = htmlspecialchars(trim($text), ENT_QUOTES);
 if (1 === get_magic_quotes_gpc())
 {
  $text = stripslashes($text);
 }

 $text = nl2br($text);
 return $text;
};

/*
 * Cette fonction sert à vérifier la syntaxe d'un email
 */
function IsEmail($email)
{
 $value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\'\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\'\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
 return (($value === 0) || ($value === false)) ? false : true;
}

// formulaire envoyé, on récupère tous les champs.
$nom        = (isset($_POST['nom']))        ? Rec($_POST['nom'])        : '';
$email      = (isset($_POST['email']))      ? Rec($_POST['email'])      : '';
$objet      = (isset($_POST['objet']))      ? Rec($_POST['objet'])      : '';
$message    = (isset($_POST['message']))    ? Rec($_POST['message'])    : '';
$antispam_h = (isset($_POST['antispam_h'])) ? Rec($_POST['antispam_h']) : '';
$antispam_r = (isset($_POST['antispam_r'])) ? Rec($_POST['antispam_r']) : '';

// On va vérifier les variables et l'email ...
$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré
$err_formulaire = false; // sert pour remplir le formulaire en cas d'erreur si besoin

if (isset($_POST['envoi']))
{
 // On demande la vraie réponse
 $verif_nospam = NoSpamQuestion('ans', $antispam_r);

 if (strtolower($antispam_h) != strtolower($verif_nospam['answer']))
 {
  // le formulaire s'arrête ici
  echo '<p>Vous n\'avez pas répondu correctement à la question Antispam ...</p>';
 }
 else
 {
  if (($nom != '') && ($email != '') && ($objet != '') && ($message != ''))
  {
   // les 4 variables sont remplies, on génère puis envoie le mail
   // était pas en commentaire  $headers  = 'From:'.$nom.' <'.$email.'>' . "\r\n";
   //$headers .= 'Reply-To: '.$email. "\r\n" ;
   //$headers .= 'X-Mailer:PHP/'.phpversion();
   $nom = "=?UTF-8?B?".base64_encode($nom)."?=";
   $objet = "=?UTF-8?B?".base64_encode($objet)."?=";
   $headers  = 'MIME-Version: 1.0' . "\r\n";
   $headers  .= 'From:'.$nom.' <'.$email.'>' . "\r\n";
   $headers  .= 'Content-Type: text/plain; charset=UTF-8;' . "\r\n";

   // envoyer une copie au visiteur ?
   if ($copie == 'oui')
   {
    $cible = $destinataire.','.$email;
   }
   else
   {
    $cible = $destinataire;
   };

   // Remplacement de certains caractères spéciaux
   $message = str_replace("'","'",$message);
   $message = str_replace("’","'",$message);
   $message = str_replace(""",'"',$message);
   $message = str_replace('<br>','',$message);
   $message = str_replace('<br />','',$message);
   $message = str_replace("<","<",$message);
   $message = str_replace(">",">",$message);
   $message = str_replace("&","&",$message);

   // Envoi du mail
   if (mail($cible, $objet, $message, $headers))
   {
    echo '<p>'.$message_envoye.'</p>';
   }
   else
   {
    echo '<p>'.$message_non_envoye.'</p>';
   };
  }
  else
  {
   // une des 3 variables (ou plus) est vide ...
   echo '<p>'.$message_formulaire_invalide.'</p>';
   $err_formulaire = true;
  };
 };
}; // fin du if (!isset($_POST['envoi']))

if (($err_formulaire) || (!isset($_POST['envoi'])))
{
 // afficher le formulaire
 echo '
 <form id="contact" method="post" action="'.$form_action.'">
 <fieldset><legend>Vos coordonnées</legend>
  <p><label for="nom">Nom : </label><input type="text" id="nom" name="nom" value="'.stripslashes($nom).'" tabindex="1" /></p>
  <p><label for="email">Email : </label><input type="text" id="email" name="email" value="'.stripslashes($email).'" tabindex="2" /></p>
 </fieldset>

 <fieldset><legend>Votre message :</legend>
  <p><label for="objet">Objet :      </label><input type="text" id="objet" name="objet" value="'.stripslashes($objet).'" tabindex="3" /></p>
  <p><label for="message">Message : </label><textarea id="message" name="message" tabindex="4" cols="55" rows="15">'.stripslashes($message).'</textarea></p>
 </fieldset>

 <fieldset><legend>Antispam</legend>
 Ecrire la réponse sans majuscule ni accent.
  <p><label for="antispam_h">'.$nospam['question'].'</label> <input type="text" name="antispam_h" id="antispam_h" /> <input type="hidden" name="antispam_r" value="'.$nospam['num'].'" /></p>
 </fieldset>

 <div style="text-align:center;"><input type="submit" name="envoi" value="Envoyer le formulaire !" /></div>
 </form>';
};
?>
0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Salut,

Plusieurs éléments à prendre en compte si tu souhaites travailler en UTF-8 :

1. htmlentities/htmlspecialchars : si le default_charset de php n'est pas l'encodage souhaité, il faut renseigner le 3ème paramètre :
htmlspecialchars($value, ENT_QUOTES, 'UTF-8')

D'ailleurs l'utilisation de htmlspecialchars dès la récupération des données n'est recommandée, il faudrait utiliser cette fonction lors de la génération du contenu html de ton mail (pour remplacer la série de str_replace)

2. Les fonctions php sur les chaines de caractères (http://fr2.php.net/manual/fr/ref.strings.php) provoquent des résultats incorrect sur des chaines en utf-8. Il faut utiliser à la place les fonctions multibyte (https://www.php.net/manual/fr/ref.mbstring.php Exemple :
echo strlen('père'); // affiche 5 car l'accent est encodé sur deux octets
echo mb_strlen('père'); // affiche 4


3. Même principe pour la fonction preg_match, il faut utiliser le modifieur 'u' pour traiter des chaines en utf-8 (https://www.php.net/manual/fr/reference.pcre.pattern.modifiers.php
Si ta version de php te le permet, préfère l'utilisation de la fonction filter_var() avec le filtre FILTER_VALIDATE_EMAIL pour vérifier l'adresse mail.

4. De mémoire le sujet d'un mail ne peut pas être encodé en UTF-8, tu es donc obliger d'utiliser des entités html (à vérifier). Pour le corps du mail tu ne devrais pas avoir de soucis à utiliser des caractères en utf-8 tant que le charset est correctement déclaré.

Bonne journée
0
cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   145
 
Pour le 1, je viens de le faire.
Pour le 2, je ne sais pas vraiment comment ni où utiliser ces fonctions.
Pour le 3, comment j'ajoute ce modifieur ?
0
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
4. Non, et je sais même pas si les clients mails interprètent les escapes HTML dans le titre/nom d'expéditeur. La RFC1342 qui décrit comment transférer du texte non-ASCII dans les headers, a introduit ceci:
=?charset?encodage?texte-encodé?=
, où encodage est B (base64) ou Q (quotable); utilisable dans n'importe quel type d'header des "Messages Internet" (mail, HTTP, etc...)
0
cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   145
 
Bonsoir

Après avoir cherché toute l'après midi, le php m'a vaincu ...
J'ai décidé de mettre en place un nouveau formulaire et j'en ais profité pour rajouter des checkbox, ce qui augmente encore l'efficacité anti spam puisque le formulaire n'est pas envoyé si on ne coche pas au minimum une case.

Sachez tout de même que vous n'avez pas tenté de m'aider inutilement !

Je sais maintenant qu'il peut y avoir quelques soucis si on utilise un encodage utf-8 et comme j'ai un peu de temps libre ces prochains jours je vais voir ce qu'on peut faire pour résoudre le soucis avec la première version du formulaire dont j'ai gardé le code.

Si jamais vous avez une idée, n'hésitez pas.

Il y a certainement de bonnes pistes dans le message https://forums.commentcamarche.net/forum/affich-30443350-probleme-avec-les-accents-dans-le-formulaire-de-contact#9 mais malheureusement mon niveau en PHP est assez bas et là je suis perdu en lisant ces tutos.

Bonne soirée :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MiniDJ92 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   7
 
Avec Notepad++ ( gratuit sur : http://notepad-plus-plus.org/fr/ )tu peux aller tout en haut dans la section "Encodage" . Par défaut , il y aura "Encoder en utf8 ( sans bom ) . Mais pour justement avoir les accents , juste en bas tu as "Encoder en ut-8" . Cliques dessus puis réactualise et voilà !!!!!
Tiens moi au courant ,
Julien (MiniDJ92)
-3
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
Si ça se trouve il est même pas sous Windows donc N++, bye bye ;)
De toute façon il a dit "j'ai convertis tous mes fichiers php en UTF8" donc c'est déjà fait...
0
cocodu67... Messages postés 3178 Date d'inscription   Statut Membre Dernière intervention   145
 
Oui je l'ai justement déjà fais en même temps que les autres fichiers de mon site et là ça dépasse mes compétences tellement le problème n'est pas logique.
0