Bonjour a tous,

J'utilise un petit script AJAX pour afficher des données récupérées à la volée dans une autre page PHP. Or si le texte contient des accents, des problèmes apparaissent. Meme en trifouillant un peu les fonctions de gestion des encodages (PHP: utf8-encode / decode / mb_convert_encoding ou JS: escape / encodeURIComponent ...) je n'arrive pas à avoir un résultat identique sous Firefox et sous Safari. Je n'ai pas encore fait de tests sous IE.

Voici un lien vers ma page de test simplifiée au plus possible:
http://www.proou.com/testAjaxSafari.php

comme vous pourrez le voir j'ai testé 16 cas différents, j'en suis en effet arrivé au point ou on teste toutes les fonctions qui passent sous la main ... ici, aussi bien en JS qu'en PHP ...

Cela fait plusieurs jours que je traine ce problème, et si quelqu'un pouvait m'aider, je lui en serait très reconnaissant.

PS: Oui j'ai parcouru les FAQ sur l'encodage, et cela n'a pas résolu mon problème, qui est pour mémoire: Une différence des affichages sous safari ou sous firefox. Merci Smiley langue


Voici mes codes:
Index:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />		
		<script type="text/javascript" src="fonctions.js"></script>

	</head>
	
	<body>
		Test des accents sous Safari et Firefox:<br>
		texte à recevoir: éèàù°&ç"
		<br><br>
		<button onclick="javascript:JS_aff_decode()">affichage avec decode en PHP</button><br>
		<button onclick="javascript:JS_aff_encode()">affichage avec encode en PHP</button><br>
		<button onclick="javascript:JS_aff_convert()">affichage avec mb_convert_encoding en PHP</button><br>
		<button onclick="javascript:JS_aff()">affichage sans fonction PHP</button><br>
		<div id="aff"></div>
	</body>
</html>


JS:
function JS_aff_decode(){
	JS_requete_ajax('aff',"AJAX_aff_decode");
}
function JS_aff_encode(){
	JS_requete_ajax('aff',"AJAX_aff_encode");
}
function JS_aff(){
	JS_requete_ajax('aff',"AJAX_aff");
}
function JS_aff_convert(){
	JS_requete_ajax('aff',"AJAX_aff_convert");
}

// échappe les caractères spéciaux
function escapeURI(La){
  if(encodeURIComponent) {
    return encodeURIComponent(La);
  }
  if(escape) {
    return escape(La)
  }
}

function JS_requete_ajax(zone,action_ajax){
		
		// Test support XMLHTTPRequest
		var XHR = null;
		if(window.XMLHttpRequest)		XHR = new XMLHttpRequest();
		else if(window.ActiveXObject) 	XHR = new ActiveXObject('Microsoft.XMLHTTP');
		else { alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");return;}
		
		//Fabriquation de l'URL
		url = "code_ajax.php?action_ajax="+action_ajax+"&champ="+zone;
		
		//Execution de la requete Ajax
		XHR.open("GET",url, true);
		XHR.onreadystatechange = function() {
			if(XHR.readyState == 4 && XHR.responseText){
				
				//Gestion réponse
				rep="JS Unescape: "+unescape(XHR.responseText);
				rep+="<br>JS Escape: "+escape(XHR.responseText);
				rep+="<br>JS encodeURIComponent: "+encodeURIComponent(XHR.responseText);
				rep+="<br>Pas de fct JS: "+XHR.responseText;
				document.getElementById(zone).innerHTML = rep;
				
			}
		}
		
		XHR.send(null);
		return;
}


PHP appelé par Ajax:
//----------------- Code Php -------------------------
switch($_GET["action_ajax"]){

	case "AJAX_aff_decode";
				echo utf8_decode("éèàù°&ç"\"");
				break;
	case "AJAX_aff_encode";
				echo utf8_encode("éèàù°&ç"\"");
				break;
	case "AJAX_aff";
				echo "éèàù°&ç"\"";
				break;
	case "AJAX_aff_convert";
				echo mb_convert_encoding("éèàù°&ç"\"", "UTF-8");
				break;			
}

Modifié par Yojimbow (08 Jan 2008 - 18:00)
Bonjour,
J'ai eu le même problème et cherché pas mal en vain, voici ma solution qui marche pour moi sous IE et FF en faisant unescape (data) dans le javascript client gérant l'envoi des data par AJAX en Post à une page PHP, et en faisant un utf8_decode(data) dans la page PHP sur les données reçues.
Mes data étant un assemblage composite, je ne fais l'encodage que sur la partie susceptible de comporter des lettres accentuées, mais on pourrait bien sûr le faire sur le tout, exemple de code :

dans javascript :
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
data="index=" + unescape (index) + "&action=" + action;
http_request.send(data);

dans le PHP :
$index=utf8_decode ($_POST["index"]);

et sur les données envoyées par la page PHP:
echo utf8_encode($string);

Cordialement