Discussion:
charset et ajax (probleme d'accent)
(trop ancien pour répondre)
ownowl
2007-06-10 10:33:14 UTC
Permalink
bonjour à tous

j'ai un souci l'accent par ajax. je suis dessus depuis plusieurs jours
et ca commence à faire bien long.

en gros :
- j'ai une page php qui comporte un champ html input (dont l'id est test)
- pour les tests, je met dans le champ input par exemple le caractère "é"
- j'envoi au serveur le contenu de ce champ par un bouton submit et
le serveur me trouve la valeur asci 233 ce qui en iso-8859-1 est bien le
caractère "é" qui a été envoyé : normal
- j'envoi le contenu de ce champ par ajax, et là le serveur me détecte 2
caractères : 195 et 169 : pas mormal

j'ai positionné partout ou j'ai pu le charset iso-8859-1, à savoir :

- dans la page html, partie php
- dans le head de la page html
- dans le mode d'encodage de l'objet XMLHttpRequest
- dans le php.ini : default_charset = "iso-8859-1"
- dans le httpd.conf d'apache : AddDefaultCharset iso-8859-1

environnement
- Xp
- apache 2.0.59
- php 5.1.2

le problème est le même quelque soit le navigateur (IE5,6,7 firefox)

une idée ?

Olivier


le code dbtest3.php :

<?
header('Content-Type: text/html; charset=iso-8859-1');

function print_charset($chaine) {
$longueur=strlen($chaine);
for($i=0;$i<$longueur;$i++) {
$caractere=substr($chaine,$i,1);
error_log("code ascii test ".$caractere." ".ord($caractere));
}
}

print_charset($_POST['test']);
error_log('test ' . $_POST['test']);
error_log('test àvé accent');
?>

<script type="text/javascript">
<!--

function getXMLHttpRequest(){
var http_request = null;
if(window.XMLHttpRequest) {// Firefox et autres
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
// set type accordingly to anticipated content type
//http_request.overrideMimeType('text/xml');
http_request.overrideMimeType('text/html');
}
}
else if(window.ActiveXObject){ // Internet Explorer
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e1) {
http_request = null;
}
}
}
return http_request;
}

function go() {

var http_request = getXMLHttpRequest();
var txt = document.getElementById('test').value;

//var parameters = "test=" + encodeURI(txt);
var parameters = "test=" + txt;

http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
//alert(http_request.responseText);

}
}
http_request.open('POST', "dbtest3.php?nocache=" + Math.random(), true);
http_request.setRequestHeader("Content-type",
"application/x-www-form-urlencoded; charset=iso-8859-1");

http_request.setRequestHeader("Content-length", parameters.length);
http_request.setRequestHeader("Connection", "close");
alert(parameters);
http_request.send(parameters);

}
-->
</script>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>test à la con</title>
</head>

<body>

<a href="dbtest3.php">reload</a>
<br/>
<a href="javascript:void(go())">go</a>

<form name="form1" method="post" action="dbtest3.php">
<input name="test" type="text" id="test" maxlength="15" value="" />
<input name="" type="submit" value="Envoyer">
</form>

</body>
</html>
Olivier Miakinen
2007-06-10 18:36:45 UTC
Permalink
Post by ownowl
j'ai un souci l'accent par ajax. je suis dessus depuis plusieurs jours
et ca commence à faire bien long.
En effet.
Post by ownowl
- j'ai une page php qui comporte un champ html input (dont l'id est test)
- pour les tests, je met dans le champ input par exemple le caractère "é"
- j'envoi au serveur le contenu de ce champ par un bouton submit et
le serveur me trouve la valeur asci 233 ce qui en iso-8859-1 est bien le
caractère "é" qui a été envoyé : normal
Ok.
Post by ownowl
- j'envoi le contenu de ce champ par ajax, et là le serveur me détecte 2
caractères : 195 et 169 : pas mormal
Il ne s'agit en fait pas de deux caractères, mais d'un seul caractère
encodé sur deux octets en UTF-8.

http://www.miakinen.net/vrac/charsets/?hv=h&o6=MacRoman&or=2&pr=233
Codage UTF-8 = C3 A9 = 195 169.
Post by ownowl
- dans la page html, partie php
- dans le head de la page html
- dans le mode d'encodage de l'objet XMLHttpRequest
- dans le php.ini : default_charset = "iso-8859-1"
- dans le httpd.conf d'apache : AddDefaultCharset iso-8859-1
Ben oui, mais XML est par défaut en UTF-8, et d'après ce que tu
décris il semble difficile d'aller contre. Pourquoi ne ferais-tu pas
un utf8_decode() en réception, si vraiment tu tiens à ISO-8859-1 ?

[ crosspost respecté, mais suivi dans un seul groupe ]
Pierre Goiffon
2007-06-11 09:55:52 UTC
Permalink
Post by Olivier Miakinen
Post by ownowl
- j'ai une page php qui comporte un champ html input (dont l'id est test)
- pour les tests, je met dans le champ input par exemple le caractère "é"
- j'envoi au serveur le contenu de ce champ par un bouton submit et
le serveur me trouve la valeur asci 233 ce qui en iso-8859-1 est bien le
caractère "é" qui a été envoyé : normal
(...)
Post by Olivier Miakinen
Post by ownowl
- j'envoi le contenu de ce champ par ajax, et là le serveur me détecte 2
caractères : 195 et 169 : pas mormal
Il ne s'agit en fait pas de deux caractères, mais d'un seul caractère
encodé sur deux octets en UTF-8.
Olivier tu aura été plus rapide que moi à répondre :)
Post by Olivier Miakinen
Post by ownowl
- dans la page html, partie php
- dans le head de la page html
- dans le mode d'encodage de l'objet XMLHttpRequest
- dans le php.ini : default_charset = "iso-8859-1"
- dans le httpd.conf d'apache : AddDefaultCharset iso-8859-1
Ben oui, mais XML est par défaut en UTF-8, et d'après ce que tu
décris il semble difficile d'aller contre. Pourquoi ne ferais-tu pas
un utf8_decode() en réception, si vraiment tu tiens à ISO-8859-1 ?
Nous en avons parlé plusieurs fois notamment dans f.c.i.w.auteurs, et
nous avions mis en ligne plusieurs exemples qui récupéraient des
contenus en ISO Latin-1 par XHR, ça fonctionnait très bien... à
condition évidemment que le charset soit correctement déclaré pour la
page récupérée !

Tiens je trouve que l'exemple que j'avais mis en ligne est toujours là :
http://pgoiffon.free.fr/_temp/XHR_charset.html
Post by Olivier Miakinen
[ crosspost respecté, mais suivi dans un seul groupe ]
Je ne lis pas le groupe PHP, et il me parait absolument pas approprié
(?!!?!!). Suivi et copie sur fr.comp.infosystemes.www.auteurs, puisque
c'est un prb générique de déclaration de charset et de XHR.
ASM
2007-06-11 09:55:52 UTC
Permalink
Post by Olivier Miakinen
Post by ownowl
- dans la page html, partie php
- dans le head de la page html
- dans le mode d'encodage de l'objet XMLHttpRequest
- dans le php.ini : default_charset = "iso-8859-1"
- dans le httpd.conf d'apache : AddDefaultCharset iso-8859-1
Ben oui, mais XML est par défaut en UTF-8,
il paraît.
Post by Olivier Miakinen
et d'après ce que tu
décris il semble difficile d'aller contre.
Je ne comprends pas, il paraîtrait qu'il suffirait d'envoyer les bons
en-têtes ?
Et là on a un très net commandement php de ces en-têtes me semble-ce.
Pourquoi n'est-ce point suivi ?

Serait-ce le XMLHttpRequest qui poste en utf-8 ?
(au lieu de simplement se cantonner à la réception dans ce charset si
omission).

Serait-ce le JS du brouteur qui s'obstine au utf-8 alors qu'on lui a
indiqué autre chose ?
(par exemple mon Safari me cracrabouille en iso-latin ce qui lui a été
envoyé en utf-8 si l'envoi n'est pas précédé de la déclaration xhtml de
charset utf-8 et ce même si la page hôte est en utf-8)
Post by Olivier Miakinen
Pourquoi ne ferais-tu pas
un utf8_decode() en réception, si vraiment tu tiens à ISO-8859-1 ?
[ crosspost respecté, mais suivi dans un seul groupe ]
Bon, je ne saurai pas si cette ficelle lui aura réussi.
--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé
ownowl
2007-06-11 09:55:52 UTC
Permalink
Post by Olivier Miakinen
Post by ownowl
- dans la page html, partie php
- dans le head de la page html
- dans le mode d'encodage de l'objet XMLHttpRequest
- dans le php.ini : default_charset = "iso-8859-1"
- dans le httpd.conf d'apache : AddDefaultCharset iso-8859-1
Ben oui, mais XML est par défaut en UTF-8, et d'après ce que tu
décris il semble difficile d'aller contre. Pourquoi ne ferais-tu pas
un utf8_decode() en réception, si vraiment tu tiens à ISO-8859-1 ?
merci de ta réponse.

en effet l'envoi est en UTF-8, apparament le paramètre charset de
setRequestHeader n'est pas pris en compte.
entre temps (2 jours entre l'écriture du message et sa diffusion) j'ai
fait quelque tests en passant mes paramètres post coté client par la
fonction javascript escape, et ca marche correctement.
Je préfère l'encodage coté client car dans mon cas toutes les requetes
sont construites en passant par une même fonction, coté serveur c'est un
peu moins vrai
a+
Olivier

Continuer la lecture sur narkive:
Loading...