Problème d'encodage ?
Posté : 06 déc. 2014, 19:26
Bonjour,
J'ai une page avec un formulaire en utf8
[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 :
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
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