lettres accentuées, ajax et serveurs

Petit nouveau ! | 6 Messages

20 mars 2008, 09:34

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!!!!
Patrice Rapaport

Eléphanteau du PHP | 28 Messages

20 mars 2008, 12:22

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 :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 mars 2008, 13:35

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

20 mars 2008, 13:57

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]

Eléphant du PHP | 79 Messages

20 mars 2008, 15:09

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?

Petit nouveau ! | 6 Messages

20 mars 2008, 15:19

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
Patrice Rapaport

ViPHP
ViPHP | 4039 Messages

20 mars 2008, 17:50

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.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Petit nouveau ! | 6 Messages

20 mars 2008, 20:09

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.
Patrice Rapaport

ViPHP
ViPHP | 3607 Messages

21 mars 2008, 11:04

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 ;)

Petit nouveau ! | 6 Messages

21 mars 2008, 11:22

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
Patrice Rapaport

Eléphant du PHP | 124 Messages

21 mars 2008, 12:49

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

ViPHP
ViPHP | 3607 Messages

21 mars 2008, 14:06

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à?

Invité
Invité n'ayant pas de compte PHPfrance

22 mars 2008, 10:39

J'ai essayé et cela ne donne rien pour moi

Petit nouveau ! | 6 Messages

22 mars 2008, 17:50

Celà ne donne rien pour moi effectivement. par contre la solution que j'ai communiqué un peu plus haut fonctionne très correctement
Patrice Rapaport