Page 1 sur 1

lettres accentuées, ajax et serveurs

Posté : 20 mars 2008, 09:34
par PatriceRapaport
Je suis en train de développer un site en utilisant la version CS de Dreamweaver (ne remettons pas cela en cause).
Les en-têtes fournis par dreamweaver sont:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">


lorsque je veux afficher des minuscules accentuées, l'enfer commence selon que je consulte le site sous Firefox ou Internet Explorer, et selon que l'affichage se fasse en appelant la page ou en affichant une réponse fournie par ajax. Le tout bien entendu est modulé (sinon ce ne serait pas drole) selon que le site soit hébergé sur un serveur apache tournant sous windows ou sur un serveur apache tournant sous LINUX (Debian).

Tant que je n'utilise pas ajax, tout se passe correctement que le serveur soit windows ou linux:
j'utilise la fonction utf8_encode pour afficher le libelle: echo utf8_encode($libelle)

Si par contre le libellé est fourni par une réponse ajax, tant que je reste sur le serveur windows, tout est encore OK:
pour firefox j'envoie echo $libelle alors que pour IE j'envoie echo utf8_encode($libelle).

Mais sous le serveur LINUX, alors que cela fonctionne pour firefox, j'obtiens un affichage farfelu sous IE dès qu'il y a des caractères accentués.

Je ne m'en sors pas. Alors si quelqu'un sait a une idée!!!!

Posté : 20 mars 2008, 12:22
par spelou
Bonjour PatriceRapaport,

As tu rajouté le meta suivant afin de spécifier que ta page est bien en UTF-8 :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Il est aussi possible que tu ais besoin de spécifier le charset utilisé dans ton httpd.conf , ou à défaut dans un .htaccess de cette façon :
AddDefaultCharset UTF-8
Un dernier point, tu sembles développer sous Windows et/ou Linux. Sous windows, lorsque tu crée un nouveau fichier, par défaut son charset sera en ISO. Mais avec n'importe quel bon éditeur, tu devrais pouvoir encoder tes fichiers en UTF-9 (sans BOM).

Bonne journée !

[edit] Je rajoute que certaines fonctions PHP supportent mal l'utf-8, il est donc nécéssaire de décoder tes chaines en ISO, de les passer à la moulinette, puis de les réencoder en UTF-8. Il existe aussi une "variante" fonctionnelle de ces fonctions, fait un tour ici pour en savoir plus :)

Posté : 20 mars 2008, 13:35
par Ryle
En complement du post de Neveldo, j'ajouterais que l'information concernant le content-type utf8 doit également être spécifiée dans le script php interrogé par ajax et qui lui retourne des données dans ce charset :)

Posté : 20 mars 2008, 13:57
par PatriceRapaport
Merci de ta réponse.

Oui, j'ai bien la ligne <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> dans mes fichiers.
En définitive, mon problème ne se pose que sous linux et encore pour une réponse fournie par Ajax. Dans les autres cas de figure, avec les tests que j'effectue pour firefox et IE, avec ou sans ajax, tout se passe correctement

J'avoue humblement que je suis allé lire l'article sous PHP France, et que je n'ai pas tout saisi!
Il y a peut-être une chose importante: les données que j'affiche proviennent d'une Base de données mysql. Mais en tout état de cause, puisqu'elles s'affichent correctement si cela ne vient pas d'ajax, pourquoi le problème se pose-t-il sous ajax?

Patrice

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 20 mars 2008, 15:09
par Alkann
Si les données proviennent de la base de donnée. Le mieux est d'avoir l'ensemble de ton application (code + bdd) en encodage UTF8, cela t'évite ces problèmes.

Pour mieux t'aider, peux tu mettre un exemple d'accentuation des retours de requêtes Ajax?

Posté : 20 mars 2008, 15:19
par PatriceRapaport
Alors que firefox écrit catégorie IE écrit cat?gorie
Je vais tester l'encodage de mes tables en utf8, mais le problème se pose également pour des alert en javascript ou des messages entre quotes en PHP

Patrice

Posté : 20 mars 2008, 17:50
par Berzemus
ach... ajax et les lettres accentuées..

Comment tu fait transiter tes données ?

Le meilleur conseil que je peux donner, c'est de te renseigner sur Json, format particulièrement adapté à l'envoi de données vers JS.

Posté : 20 mars 2008, 20:09
par PatriceRapaport
Je pense avoir trouvé une solution

si les données a afficher ne viennent pas d'une base de données:
-si l'affichage ne provient pas d'ajax echo html_entity_decode(htmlentities('é è à')
- si l'affichager provient d'ajax alors pour IE: echo 'é è à' pour firefox echo html_entity_decode(htmlentities('é è à', ENT_COMPAT, 'UTF-8'))

si les données viennent d'une base mysql avec default-charset latin1,
- si l'affichage ne provient pas d'ajax echo utf8_encode($db[$maZone])
- Si l'affichage provient d'ajax pour IE: utf8_encode($db[$maZone]) et pour firefox html_entity_decode(htmlentities($db[$maZone]))

Voila c'est peut-être un peu lourd, mais ça a l'air de fonctionner sous Wndows et sous Linux.

Posté : 21 mars 2008, 11:04
par jojolapine
Avant de faire tout ça...
Est-ce que sur tes pages php appelée par ajax tu mets un header() "d'encodage" (dsl j'ai plus la syntaxe en tête: encoding? content-encoding?) bref vous m'aurez compris ;)

Posté : 21 mars 2008, 11:22
par PatriceRapaport
Oui bien entendu, ce header est présent.

La solution dont je parle plus haut est opérationnelle, elle fonctionne!!!
Mais je trouve cela vraiment lourd

Posté : 21 mars 2008, 12:49
par gwendal
J'ai le même problème avec un script que je fais sous drupal avec de l'ajax

Quand j'envoi le post au script drupal l'ensemble de la chaine est bien en UTF-8 et si j'affiche ma variable juste avant l'enregistrement dans la base, il n'y a pas de problème d'encodage, mais si je l'enregistre dans la base dans un champ utf8_general_ci les caractères sont encodés

Exemple : é devient é et à devient Ã

Il y a peut-être un rapport avec le fait que l'envoi en post à mon ajax ce fait par une variable encodée par encodeURIComponent

Posté : 21 mars 2008, 14:06
par jojolapine
Je ne sais pas si ça peut faire partie du problème, mais j'avais un problème avec utf8 lorsque les données venait d'une bdd...
Du coup j'ai réussit à le régler en éxécutant cette requête avant:

Code : Tout sélectionner

SET NAMES utf8
Est-ce que tu fais déjà celà?

Posté : 22 mars 2008, 10:39
par Invité
J'ai essayé et cela ne donne rien pour moi

Posté : 22 mars 2008, 17:50
par PatriceRapaport
Celà ne donne rien pour moi effectivement. par contre la solution que j'ai communiqué un peu plus haut fonctionne très correctement