[RESOLU] Problème d'encodage ?

Eléphant du PHP | 94 Messages

06 déc. 2014, 19:26

Bonjour,

J'ai une page avec un formulaire en utf8
<meta charset="utf-8">
J'inclus un fichier javascript qui contient une fonction d'envoi des données :

[javascript]function envoi() {

var obj_ajax =null;
if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
obj_ajax =new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
obj_ajax =new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
obj_ajax =new XMLHttpRequest();
}
} else {
document.getElementById("info").innerHTML ="Votre navigateur ne permet pas de valider des créations.";
return;
}
obj_ajax.open("POST", "page_appelee.php", true);

//traitement requete asynchrone************************************
obj_ajax.onreadystatechange = function() {
if (obj_ajax.readyState ==4) {
if (obj_ajax.status !=500 && obj_ajax.status !=404) {
alert(obj_ajax.responseText);
return;
}
}
}
//*****************************************************************

obj_ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var data ="numero="+escape(document.getElementById("racine").innerHTML+document.getElementById("numero").value)+"&racine="+escape(document.getElementById("racine").innerHTML)+"&libelle="+escape(document.getElementById("libelle").value);
obj_ajax.send(data);
}[/javascript]
L'envoi est donc en POST avec 3 variables, racine, numero et libelle.
Jusque-là, ça fonctionne...

Dans ma page appelée, j'ai :
header('Content-Type:text/html; charset=utf-8'); 

//libellé : Lettre en premier, puis Lettre ou caractères accentués ou chiffres ou / ou espace ou ()...
if (!preg_match("/^[A-Za-zâêîôûàèìòùéíäëïöüçÂÊÎÔÛÀÈÙÉÄËÏÜÖÇ]{1}[A-za-z0-9âêîôûàèìòùéíäëïöüçÂÊÎÔÛÀÈÙÉÄËÏÜÖÇ_() \/'-]{0,".(T_LIB-1)."}$/u", $_POST["libelle"])) {
	echo("var retour=0;");
	echo("var commentaire='".$_POST["libelle"]."';");
	exit(0);
}
Et voilà où ça coince.

Si j'ai dans ma variable $_POST["libelle"] : FOURNISSEURS ET COMPTES RATTACHES
Pas de problème; mon preg_match la considère comme valide.

Par contre, si j'ai : FOURNISSEURS ET COMPTES RATTACHÉS

(avec un E accentué); preg-match la considère comme invalide.

Si je mets ma fonction preg_match dans un fichier php d'essai sans passer par ajax, elle fonctionne bien.

J'en conclu donc qu'il y a un problème d'encodage de caractères.

J'ai tenté d'enlever le header() en première ligne pour voir, ça ne change rien.

Comment résoudre ça ?

J'ai cherché sur internet mais rien trouvé de notable ou de clair. Les seuls solutions proposées disent de passer en iso, ce que je ne veux pas.

Une idée ?
Est-ce le setRequestHeader() qui pose problème ?

Merci d'avance.

Michel

Eléphant du PHP | 94 Messages

06 déc. 2014, 19:48

J'ai trouvé une solution temporaire bancale :

Je passe toutes mes variables $_POST à utf8_encode().

À partir de là, ça fonctionne mais me semble bancal et lourd.

Une autre solution ?

Eléphant du PHP | 94 Messages

08 déc. 2014, 20:28

Récapitulatif pour ceux qui cherchent une réponse au même problème.

Pour l'envoi ajax :
[javascript]obj_ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");[/javascript]
J'envoie en POST.

Dans le php qui traite la demande :

Les variables à retourner sont :

-Soit échappées directement s'il s'agit d'un message : Genre :
 echo ("var commentaire ='S\'il s\'agit d\'un message';");
- Soit le contenu d'une variable est échappée par addslashes(). Par exemple le retour d'une requête SQL.

Enfin, dans mon javascript qui exploite le retour (ready.state), jje fais un eval() pour créer mes variables (là "commentaire" par exemple); puis j'enlève les échappements par un [javascript]commentaire.replace(/\\\'/g, "'");[/javascript]

Pour moi, le problème ne se posait qu'avec des apostrophes.