Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ajax et accent

39 réponses
Avatar
osele
Bonjour,

J'ai beau avoir lu pas mal de page sur le sujet je ne comprends pas le
pb.

J'ai une page ou=C3=A8be qui s'affiche tr=C3=A8s bien en direct, avec des
accents, sous Firefox:

http://osele.free.fr/prg/accent.html

Dans, cette page, j'ai un script qui la charge en ajax et l'affiche =C3=A0
la suite.

Visiblement, la page est syst=C3=A9matiquement r=C3=A9cup=C3=A9r=C3=A9e en =
utf-8 !

Ca ne marche pas pour les accents, qui sont remplac=C3=A9s par des ?

Quel est le pb ?

(Je ne peux pas toucher la page source qui est sur un autre site.)


J'ai simplifi=C3=A9 le code et voici le source (j'ai essay=C3=A9 diff=C3=A9=
rents
RequestHeader) :
<html><head>
<meta http-equiv=3D"Content-Type" content=3D"text/html;
charset=3DISO-8859-1">
<meta http-equiv=3D"Content-Style-Type" content=3D"text/css">
<title>pas de titre</title>
<script language=3D"Javascript" type=3D"text/javascript">
function ajax(url) {
var xhr=3Dnull;
// d=C3=A9tection du navigateur pour la cr=C3=A9ation de l'objet XMLHttpRe=
quest
(soit l'acronyme xhr)
if (window.XMLHttpRequest) {
xhr =3D new XMLHttpRequest();
}
else if (window.ActiveXObject) {
xhr =3D new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open( "GET", url,false);
// xhr.setRequestHeader("Content-Type", "application/x-www-form-
urlencoded;");
// xhr.setRequestHeader("Content-Type", "application/x-www-form-
urlencoded;charset=3DISO-8859-1");
// xhr.setRequestHeader("Content-Type", "text/html");
xhr.setRequestHeader("Content-Type", "text/html;
charset=3DISO-8859-1;");
// xhr.setRequestHeader("Accept-Charset", "ISO-8859-1;q=3D0.7");
// xhr.setRequestHeader("Accept-Language", "fr;q=3D0.8");
// xhr.setRequestHeader("Content-Type", "text/html; charset=3Dutf-8");
// xhr.setRequestHeader("Content-Type", "text/
html;","charset=3DISO-8859-1;");
xhr.send(null);
var tmpdiv =3D document.createElement('div');
tmpdiv.innerHTML =3D xhr.responseText;
document.body.appendChild(tmpdiv);
}
</script>
</head>
<body>
=C3=A9<p/>
=E2=82=AC<p/>
<a href=3D'javascript:void(0);' onclick=3D'ajax(location.href);'>cliquez
ici</a>
</body>

a+
Vincent

10 réponses

1 2 3 4
Avatar
Olivier Miakinen

J'ai une page ouèbe qui s'affiche très bien en direct, avec des
accents, sous Firefox:

http://osele.free.fr/prg/accent.html


<cit.>
Response Headers - http://osele.free.fr/prg/accent.html

Age: 37
Accept-Ranges: bytes
Date: Mon, 16 Apr 2007 14:57:47 GMT
Content-Length: 1396
Content-Type: text/html
Server: Apache/ProXad [Dec 3 2006 11:06:18]
Last-Modified: Mon, 16 Apr 2007 14:36:23 GMT
Etag: "205d21-574-462389e7"
Via: 1.1 proxy2 (NetCache NetApp/6.0.4)

200 OK
</cit.>

Commence donc par configurer ton serveur pour qu'il annonce le jeu de
caractères utilisé dans l'entête HTTP Content-Type. Si ça ne marche pas
tu peux essayer de rajouter un attribut charset à la balise <script>,
mais je ne sais pas si ça fonctionne pour les scripts internes comme
pour les scripts externes.

Avatar
vicnet
On 16 avr, 17:12, Olivier Miakinen <om+ wrote:
J'ai une page ouèbe qui s'affiche très bien en direct, avec des
accents, sous Firefox:
http://osele.free.fr/prg/accent.html
Content-Type: text/html

Commence donc par configurer ton serveur pour qu'il annonce le jeu de
caractères utilisé dans l'entête HTTP Content-Type.


En effet, il n'y rien, mais ca je ne peux le changer vu que le
serveur, c'est free !
Je n'ai pas accès à la conf appache.

Si ça ne marche pas
tu peux essayer de rajouter un attribut charset à la balise <script>,
mais je ne sais pas si ça fonctionne pour les scripts internes comme
pour les scripts externes.


Je viens de faire le test, ca ne fonctionne pas (j'ai changé le
fichier accent.html).

Ce que je ne comprends pas, c'est pourquoi Firefox voit le même
fichier comme de l'utf-8 alors qu'en accès direct ca marche.
J'ai la même réponse du serveur sous firebug en direct et en ajax....

Que faut-il faire sous js de firefox pour forcer l'iso ?

Néanmoins, merci pour ta réponse.

a+
Vincent


Avatar
Mihamina (R12y) Rakotomandimby
vicnet - :

En effet, il n'y rien, mais ca je ne peux le changer vu que le
serveur, c'est free !
Je n'ai pas accès à la conf appache.


htacces, tout ça...
genre: http://www.w3.org/International/questions/qa-htaccess-charset

Avatar
ASM
vicnet - :

En effet, il n'y rien, mais ca je ne peux le changer vu que le
serveur, c'est free !
Je n'ai pas accès à la conf appache.


htacces, tout ça...
genre: http://www.w3.org/International/questions/qa-htaccess-charset


Perso, je ne suis jamais arrivé à esspliquer à FF que responseText
n'était pas en utf-8
de même, avec Safari, je ne suis pas arrivé à lui faire comprendre que
respnseText pouvait être en utf-8.

La seule parade que j'ai trouvée est d'insérer le code de charset à la
mode XML dans les fichiers appelés via XMLHttpRequest


Le code suivant fonctionne bien chez moi :
(FF et Safari)

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>test ajax et charset</title>
<meta http-equiv="content-type"
content="text/html; charset=ISO-8859-1" />
<meta http-equiv="Content-Style-Type" content="text/css">
<title>pas de titre</title>
<script language="Javascript" type="text/javascript">
function ajax(url) {
var httpRequest = false;
if (window.XMLHttpRequest)
{ // Mozilla, Safari,...
httpRequest = new XMLHttpRequest();
if(httpRequest.overrideMimeType) {
httpRequest.overrideMimeType('text/xml');
}
}
else if(window.ActiveXObject)
{ // IE
try {
httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
if (!httpRequest) {
alert('Abandon :( Impossible de créer une instance XMLHTTP');
return false;
}
httpRequest.onreadystatechange = function() {
alertContents(httpRequest);
};
httpRequest.open('GET', url, true);
httpRequest.send(null);
}

function alertContents(httpRequest) {
if httpRequest.readyState == 4) {
if (httpRequest.status == 200) {
var tmpdiv = document.createElement('div');
tmpdiv.innerHTML = httpRequest.responseText;
document.body.appendChild(tmpdiv);
}
else {
alert('Un problème est survenu avec la requête.');
}
}

}
</script>
</head>
<body>
<p>é
<p>ç
<p><a href='javascript:void(0);' onclick='ajax(location.href);'>
cliquez ici</a>
</body>
</html>


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Avatar
vicnet
On 17 avr, 01:43, ASM
wrote:
La seule parade que j'ai trouvée est d'insérer le code de charset à la
mode XML dans les fichiers appelés via XMLHttpRequest

<?xml version="1.0" encoding="ISO-8859-1"?>


En effet, avec cette ligne tout fonctionne.

Le seul hic, c'est que je ne maitrise pas les pages html que je
charge.
Mon prog est en fait une extension firefox ajoutant des fonctions à
phpbb, fonctions utilisant ajax.
Or phpbb (plus précisement le template du phpbb sur lequel je fait mes
tests) n'insère pas cette balise xml.

Peut être que je peux forcer ceci dans l'extension elle même...

En tout cas, merci pour l'info et une partie de la solution !

a+
Vicnet

Avatar
ASM
On 17 avr, 01:43, ASM
wrote:

<?xml version="1.0" encoding="ISO-8859-1"?>


En effet, avec cette ligne tout fonctionne.

Le seul hic, c'est que je ne maitrise pas les pages html que je
charge.


Et en passant par un fichier php ?
(qui aura le bon header de charset)


function ajax(url) {
// blabla
httpRequest.open('GET', 'suivi.php?url='+url, true);
// blabla
}



'suivi.php' :

<?
// truc de header/charset à la mode php
$url = $_GET['url'];
if(isset($url) && !empty($url))
{
$handle = fopen ($url, "r");
$contents = fread ($handle, 800000);
fclose ($handle);
echo $contents;
}
else
{
echo "<html><h1>Erreur de chargement</h1><p>url = $url</html>";
}
?>

Mon prog est en fait une extension firefox ajoutant des fonctions à
phpbb, fonctions utilisant ajax.


Oui ... bon ... j'y connais rien en extensions.
Le coup du php de chargement ne va sans doute pas être le top comme
soluce. D'autant que je ne suis pas fortich en php et ne sais si ce code
pourrait faire ...

Or phpbb (plus précisement le template du phpbb sur lequel je fait mes
tests) n'insère pas cette balise xml.


y a plus qu'à :-)




--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Avatar
Pierre Goiffon
vicnet wrote:
La seule parade que j'ai trouvée est d'insérer le code de charset à la
mode XML dans les fichiers appelés via XMLHttpRequest

<?xml version="1.0" encoding="ISO-8859-1"?>


En effet, avec cette ligne tout fonctionne.


Je n'ai pas bien le temps de le vérifier, mais je suis assez persuadé
qu'entre la déclaration charset dans le prologue XML et la déclaration
dans l'entête HTTP, c'est la 2eme qui l'emporte... comme toujours !


Avatar
ASM
vicnet wrote:
La seule parade que j'ai trouvée est d'insérer le code de charset à la
mode XML dans les fichiers appelés via XMLHttpRequest

<?xml version="1.0" encoding="ISO-8859-1"?>


En effet, avec cette ligne tout fonctionne.


Je n'ai pas bien le temps de le vérifier, mais je suis assez persuadé
qu'entre la déclaration charset dans le prologue XML et la déclaration
dans l'entête HTTP, c'est la 2eme qui l'emporte... comme toujours !


L'entête HTTP de quoi ?

Si j'ai bien compris, on tente de récupérer via XMLHttpRequest, un
fichier de provenance (serveur) inconnue ou sans entête 'serveur' de charset

Est-ce que le serveur "headerise" systématiquement le charset par défaut
sur une requête asynchrone ?


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé



Avatar
Patrick Mevzek
Je n'ai pas bien le temps de le vérifier, mais je suis assez persuadé
qu'entre la déclaration charset dans le prologue XML et la déclaration
dans l'entête HTTP, c'est la 2eme qui l'emporte... comme toujours !



Sur http://www.w3.org/International/O-charset il est dit :
Ensure that there is no conflict between what you declare in the document
and what the server automatically applies, since server settings override
in-document declarations.

L'entête HTTP de quoi ?


De la réponse. Tout message HTTP a des en-têtes, et une réponse d'un
serveur doit avoir l'en-tête Content-Type.

Si j'ai bien compris, on tente de récupérer via XMLHttpRequest, un
fichier de provenance (serveur) inconnue ou sans entête 'serveur' de
charset


L'application qui génère la réponse sur le serveur est donc fautive :
c'est son travail que de préciser le charset dans l'en-tête HTTP
adéquat.

Est-ce que le serveur "headerise" systématiquement le charset par
défaut sur une requête asynchrone ?


Un serveur bien configuré met systématiquement un charset (s'il n'est
pas déjà présent), à toutes les réponses (asynchrones ou non), pour
éviter un certain nombre d'attaques.

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>


Avatar
Patrick Mevzek
Je n'ai pas bien le temps de le vérifier, mais je suis assez persuadé
qu'entre la déclaration charset dans le prologue XML et la déclaration
dans l'entête HTTP, c'est la 2eme qui l'emporte... comme toujours !


http://www.w3.org/International/tutorials/tutorial-char-enc/
Paragraphe : Precedence rules

En résumé (du plus prioritaire au moins prioritaire) :
1. HTTP Content-Type
2. XML declaration
3. meta charset declaration
4. link charset attribute


Content-Type rulez !

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

1 2 3 4