Problème de caractères avec UTF8... :-/

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de caractères avec UTF8... :-/

par Eagle » 28 sept. 2008, 20:19

OK, merci AB.

Bien noté...
Je n'ai pas le temps maintenant, mais je m'en occupe dès demain soir.
Je vais repartir de tes vérifications et refaire complètement mes fonctions.

Je vous tiens au courant du résultats dans les 2 jours qui viennent.

Quant à toi Berzemus... bien vu cette petite couverture de bouquin... :wink:
Mais c'est moi qui en fait les frais si je comprends bien... :lol: :D :wink:

Merci encore à vous pour votre temps.

par Berzemus » 28 sept. 2008, 18:26

Image

(Un mois que j'attends de le placer.. :D )

par AB » 28 sept. 2008, 18:18

L'est pas bon ton code.

Si tu regardes bien le tuto que tu as mentionné plus haut, tu verras qu'on peux faire beaucoup plus simple tout en étant beaucoup plus optimisé pour la protection de l'enregistrement des données.

1/ Je teste si magic_quotes_gpc() est activé et si oui j'applique un stripslashes().

2/ Ensuite je protège en appliquant systématiquement mysql_real_escape_string().

3/ Pour l'affichage il suffit ensuite de faire echo htmlspecialchars() (sans avoir besoin de tenir compte de la configuration magic_quotes du serveur).

Ton code posera problème en cas de changement de la configuration magic_quotes_gpc() du serveur entre l'enregistrement et l'affichage des données... également si tu transférais ta base sur un autre serveur avec une config différente. Et dans tout ce mic mac tu as oublié de protégé l'affichage des données si magic_quotes est activé, puisque tu fais simplement $Variable = stripslashes($Variable);

Donc je te conseille de t'inspirer de la méthode du tuto.

Par ailleurs le code du tuto est totalement fonctionnel pour peu que tu créé la table "membres" comme indiqué et que tu renseignes les champs de connexion à la bdd. Au max cela te prendras cinq minutes pour le tester et cela te permettrait de voir si le code passe correctement chez toi au standard utf-8 (enregistrement des caractères dans la bdd et affichage).

par Eagle » 28 sept. 2008, 12:26

Bonjour à tous.

Alors pour résumer tous vos posts :

@dunbar : non, je n'ai pas essayé "utf8_decode()".
Je n'ai pas voulu utiliser cette fonction car je pensais que le "tout utf8" permettait de l'éviter... mais en dernier ressort... si je dois y passer...

@Victor BRITO : mes fichiers PHP sont édités avec Zend studio en UTF8, et normalement sans BOM...
En revanche, je vais quand même les revérifier avec NotePad++ (mais je ne pense pas qu'il y ait de souci à ce niveau...)

@AB :
1- OK, mes tables sont en UTF8_bin et l'interclassement aussi.
2- Le header des entêtes est bien celui-là
3- j'ai bien la requête "SET NAMES 'utf8'" dans ma fonction de connexion de manière à ce qu'elle soit exécutée à chaque fois.
4- j'ai également la balise meta pour l'encodage UTF-8...

J'avoue que là... c'est bien la première fois que je reste bloqué sur un truc comme ça... ! :?

Dans le doute, je vous mets les fonctions en question car je ne vois plus qu'un problème à leur niveau...

Fichier des entêtes :
//On force les entêtes en UTF-8
header("content-type:text/html; charset=utf-8");
session_start();
ob_start('ob_gzhandler');
setlocale(LC_CTYPE,'french');

//On écrit l'entete de la page
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"".$aConf["global"]["lang_abbreviation"]."\" lang=\"".$aConf["global"]["lang_abbreviation"]."\" dir=\"".$aConf["global"]["lang_direction"]."\">\n";
echo "    <head>\n";
//On écrit les balises META
echo "        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n";
echo "        <meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n";
echo "        <meta http-equiv=\"Content-Style-Type\" content=\"text/javascript\" />\n";
echo "        <meta http-equiv=\"Content-Language\" content=\"".$aConf["global"]["lang_abbreviation"]."\" />\n";
echo "        <meta name=\"author\" content=\"".NOM_DEVELOPPEUR."\" />\n";
echo "        <meta name=\"generator\" content=\"Zend Studio\" />\n";
echo "        <meta name=\"keywords\" content=\"".KEYWORDS_META."\" />\n";
echo "        <meta name=\"description\" content=\"".DESCRIPTION_META."\" />\n";
echo "        <link rel=\"stylesheet\" href=\"".$sRacineSite."/themes/".$aConf["global"]["theme"]."/style.css\" type=\"text/css\" media=\"all\" />\n";
echo "        <title>".TITRE_BARRE_TITRES."</title>\n";
echo "    </head>\n";
Connexion :
function connexion($sServeur, $sBase, $sUser, $sPwd){

     //Messages d'erreur de connexion
     //Pour le serveur
     $sErrServeur = "Connexion au serveur <b>\"".$sServeur."\"</b> impossible !";
     $sErrServeur = $sErrServeur . "<br>Identification de l'erreur : ";

     //Pour la BDD
     $sErrBdd = "Connexion à la base de données <b>\"".$sBase."\"</b> impossible !";
     $sErrBdd = $sErrBdd . "<br>Identification de l'erreur : ";

     //Connexion au serveur
     $bConnexion = @mysql_connect($sServeur, $sUser, $sPwd, TRUE);
     $GLOBALS["connexion"] = $bConnexion or die($sErrServeur . mysql_error());
     
     //Connexion à la base de données choisie
     $db = @mysql_select_db($sBase,$GLOBALS["connexion"]);
     $db = $db or die($sErrBdd . mysql_error());

     //Indique à MySQL de travailler en UTF-8 (par défaut MySQL risque de travailler au standard ISO-8859-1)
     mysql_query("SET NAMES 'utf8'");
}
Détection ou non de l'activation des magic_quotes :
function test_magic_quotes(){
 	//On fait notre tests
 	if(get_magic_quotes_gpc()){
 		//Les magic_quotes sont activées
 		$bMagicQuotes = TRUE;
 	}
 	else{
 		//Les magic_quotes sont desactivées
 		$bMagicQuotes = FALSE;
 	}
 	
 	//On retourne le résultat
 	return $bMagicQuotes;
}
Traitement pour enregistrement dans BDD :
function cleanData($Variable){
 	//On vérifie l'activation ou non des magic_quote
 	if(test_magic_quotes() == FALSE){
 		//Magic_quote désactivées donc on traite les données
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Suppression des espaces
	 			$Variable[$i] = trim($Contenu);
	 			
		    	//Echappement des caractères spéciaux MySQL (',",\n,\r,NULL...)
		    	$Variable[$i] = mysql_real_escape_string($Contenu);
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
 			//Suppression des espaces
 			$Variable = trim($Variable); 			
 			
			//Echappement des caractères spéciaux MySQL (',",\n,\r,NULL...)
			$Variable = mysql_real_escape_string($Variable);
 		}
 	}
 	else{
 		//Magic_quote activées, donc on ne rajoute pas de caractères d'échappement
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Suppression des espaces
	 			$Variable[$i] = trim($Contenu);
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
 			//Suppression des espaces
 			$Variable = trim($Variable);
 		}	
 	}
 	
 	//On retourne la variable
 	return $Variable;
}
Traitement pour affichage après extraction de la BDD :
function displayData($Variable){
 	//On vérifie l'activation ou non des magic_quote
 	if(test_magic_quotes() == FALSE){
 		//Magic_quote désactivées donc on traite les données
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Conversion des caractères spéciaux HTML
	 			$Variable[$i] = htmlentities($Contenu, ENT_QUOTES, 'UTF-8');
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
	 			//Conversion des caractères spéciaux HTML
	 			$Variable = htmlentities($Variable, ENT_QUOTES, 'UTF-8');
 		}
 	}
 	else{
 		//Magic_quote activées, donc on supprime les caractères d'échappement "\"
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Suppression des backslashes
	 			$Variable[$i] = stripslashes($Contenu);
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
 			//Suppression des backslashes
 			$Variable = stripslashes($Variable);
 		}		
 	}
 	
 	//On retourne la variable
 	return $Variable;
}
Et je viens de me rendre compte que mes caractères type guillemets par exemple ne doivent pas être échapés correctement car si je réaffiche la valeur dans un input, les guillemets sont bien présent, mais du coup le reste de ma ligne de code n'est pas prise en compte.
(exemple : value="opération "Teddy"" -> je ne vois que "opération dans le input)
J'ai trouvé une solution en rajoutant un $Variable = htmlspecialchars($Variable, ENT_QUOTES,'UTF-8'); dans la fonction de traitement de l'enregistrement, mais je ne pense pas que ce soit le bon truc...

Voilà, j'espère que ça va pouvoir vous éclairer. :roll:

Re: Problème de caractères avec UTF8... :-/

par Sékiltoyai » 28 sept. 2008, 11:39

2/ L'envoi des entêtes php spécifiant au serveur de travailler en utf-8
header('Content-type: text/html; charset=UTF-8'); 
Au client mon cher, non au serveur. C'est exactement équivalent à la meta :)

Re: Problème de caractères avec UTF8... :-/

par AB » 28 sept. 2008, 05:35

Si mes fonctions PHP de traitement vous intéressent... dites-le moi. (c'est peut-être elles qui plantent, elles sont un brin différentes de celles d'AB).
Y'a certaines lignes qui ne devraient pas être différentes (à moins que tu aies directement la main sur la configuration du serveur) :

1/ La table doit être déclarée en utf-8 (cf création de la table d'enregistrement du tuto)

2/ L'envoi des entêtes php spécifiant au serveur de travailler en utf-8
header('Content-type: text/html; charset=UTF-8'); 

3/ La ligne indiquant à mysql de travailler en utf-8 (juste après la connexion à la bdd)
mysql_query("SET NAMES 'utf8'"); 
4/ La ligne html indiquant de travailler en UTF-8

Code : Tout sélectionner

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
(bien que dans l'absolu, l'entête php prime sur la balise méta html)

par Victor BRITO » 28 sept. 2008, 03:16

Les fichiers PHP sont-ils correctement édités en UTF-8 (sans BOM, de préférence) ?

par dunbar » 28 sept. 2008, 00:39

Salut

A tu essayer utf8_decode() :?:

Problème de caractères avec UTF8... :-/

par Eagle » 27 sept. 2008, 19:44

Bonjour à tous.

Je me permets de revenir vers vous car j'ai un problème d'encodage de caractères...
Je refais un site PHP avec une BDD MySQL 5 sur l'hébergeur 1and1.
Mon site est entièrement en UTF8.
Ma BDD (jeu de caractères et interclassement) est en UTF8_bin.

J'ai tout reessayé en suivi le tutoriel suivant (http://www.phpfrance.com/forums/voir_sujet-242539.php), me disant que je m'étais peut être planté... mais apparemment... c'est pareil.
Si mes fonctions PHP de traitement vous intéressent... dites-le moi. (c'est peut-être elles qui plantent, elles sont un brin différentes de celles d'AB).

Pour l'affichage du texte provenant de mes fichiers, aucun problème, tout est affiché correctement.
En revanche, lorsque j'enregistre, via un forulaire, des informations dans ma BDD, l'affichage n'est pas comme on le souhaiterait...

Dans la BDD, le texte est stocké sous la forme du type : " test "opération" "
A l'affichage, je me retrouve avec des petits carrés, comme si le texte était en ISO-8859-1 !!! :?

Si quelqu'un veut tester... c'est par ici.
Login : test
MdP : phpfrance
(le site est presque en production... donc beaucoup risquent de ne pas vous intéresser... mais bon... et au passage... je suis preneur de toute(s) suggestion(s)/amélioration(s) par rapport au site autres que BDD :wink: :) )

Voilà, j'espère que vous m'avez compris.
Merci d'avance pour votre aide (et solution j'espère...).