OVH Cloud OVH Cloud

JSON et caracteres accentues.

10 réponses
Avatar
Thierry
Bonjour,

(XPost avec fu2 fclj)

J'utilise JSON pour serialiser des objets JS pour les passer a mes scripts
PHP via AJAX.

JSON.stringify (fonction JS) remplace les accents par leurs equivalent hexa
(é -> \xE9), ce qui parait normal.
Dans mes log d'apache ma variable object est bonne et contient apr%E9%E8%
E0s (apréèàs).

Je sauvegarde ca dans MySql et c'est les bons caractéres.
Ensuite je fais un echo de mon objet (la variable passée en parametre) pour
que la callback AJAX mette a jour la page, et là les 3 caracteres ne sont
plus bons et sont replacés par \xFD\xFD\xFD (vu par le debugguer JS).
Donc quand je recree mon object au niveau JS
var theElement = eval('(' + reponses[1] + ')');
j'ai des caracteres a la con au lieu des accents.

Si mon script PHP fait :
echo JSON_encode($_REQUEST['object']); alors les 3 caracteres sont replacés
par: \\u0000.

Une idée ??

10 réponses

Avatar
Olivier Miakinen

J'utilise JSON pour serialiser des objets JS pour les passer a mes scripts
PHP via AJAX.


On peut faire de l'AJAX en Latin1 ? Sinon, je suppose que c'est de l'UTF-8.

JSON.stringify (fonction JS) remplace les accents par leurs equivalent hexa
(é -> xE9), ce qui parait normal.


À moi aussi ça me paraît normal.

Dans mes log d'apache ma variable object est bonne et contient apr%E9%E8%
E0s (apréèàs).


C'est une URL ? En Latin1 ça pourrait éventuellement être normal, mais
en UTF-8 c'est incorrect (é = %C3%A9, è = %C3%A8, à = %C3%A0).

Je sauvegarde ca dans MySql et c'est les bons caractéres.


MySql sauvegarde les caractères en Latin1 ? En UTF-8 ? En UTF-16 ?

Ensuite je fais un echo de mon objet (la variable passée en parametre) pour
que la callback AJAX mette a jour la page, et là les 3 caracteres ne sont
plus bons et sont replacés par xFDxFDxFD (vu par le debugguer JS).


Et la page, elle utilise quel charset ?

Avatar
Thierry
Olivier Miakinen <om+ écrivait
news:e2bjcf$ug0$:

J'utilise JSON pour serialiser des objets JS pour les passer a mes
scripts PHP via AJAX.


On peut faire de l'AJAX en Latin1 ? Sinon, je suppose que c'est de
l'UTF-8.


J'en sais foutre rien :-) Les histoires de charset ca m'a toujours passé au
dessus et pas interessé, mais là ça bugue...

JSON.stringify (fonction JS) remplace les accents par leurs
equivalent hexa (é -> xE9), ce qui parait normal.


À moi aussi ça me paraît normal.

Dans mes log d'apache ma variable object est bonne et contient
apr%E9%E8% E0s (apréèàs).


C'est une URL ? En Latin1 ça pourrait éventuellement être normal, mais
en UTF-8 c'est incorrect (é = %C3%A9, è = %C3%A8, à = %C3%A0).

Je sauvegarde ca dans MySql et c'est les bons caractéres.


MySql sauvegarde les caractères en Latin1 ? En UTF-8 ? En UTF-16 ?


C'etait en latin1_swedish_ci et j'avais tout rebasculé (table et champs) en
utf8_unicode_ci. Que prendre ?

Ensuite je fais un echo de mon objet (la variable passée en
parametre) pour que la callback AJAX mette a jour la page, et là les
3 caracteres ne sont plus bons et sont replacés par xFDxFDxFD (vu
par le debugguer JS).


Et la page, elle utilise quel charset ?


ISO-8859-1

Ca marche sur une des pages en précisant :
header("Content-Type: text/plain; charset=iso-8859-1");
et de rebalancer l'objet passé en parametre (en iso) en non pas celui
rechargé a partir de la base (qui doit être en UTF8.
Ce qui est etonnant c'est que Mysql reconnaissent automatiquement le iso-
8859 et le convertisse bien en UTF-8.

C'est donc bien un probleme de charset. Que prendre ? iso-8859-1 ou UTF-8 ?
Et c'est quoi l'interclassement a choisir dans mysql selon le charset ?


Avatar
ASM

J'utilise JSON pour serialiser des objets JS pour les passer a mes
scripts PHP via AJAX.



C'est donc bien un probleme de charset. Que prendre ? iso-8859-1 ou UTF-8 ?
Et c'est quoi l'interclassement a choisir dans mysql selon le charset ?


Je retiens que c'est de l'Ajax donc du XMLHttpRequest

Perso, en dehors de tout pb de base de donnée en chinois ou en martien,
sur mon sitos chez Wanadoo qui n'envoie pas de charset,
avec des pages écrites en utf-8 (avec le meta du bon charset)
où sont effectuées de simples inclusions par XMLHttpRequest de fichiers
textes (html) en utf-8 eux-aussi

j'obtiens de bons résultats avec Fx
normal : de l'utf-8 dans de l'utf-8, ça doit être compatible, non ?
He bien non ! j'obtiens du charabia avec Safari

Pour Safari, il m'a fallu re-coller en tête des fichiers à inclure
la déclaration XML de charset (utf-8)
(et ça fait très moche dans le code de la page, après inclusion)

Si ça peut guider dans l'approche du problème rencontré ?
(autant ce n'est pas la faute à mysql mais au brouteur ?)

--
Stephane Moriaux et son [moins] vieux Mac



Avatar
Olivier Miakinen

On peut faire de l'AJAX en Latin1 ? Sinon, je suppose que c'est de
l'UTF-8.


J'en sais foutre rien :-) Les histoires de charset ca m'a toujours passé au
dessus et pas interessé,


Mauvaise réponse. À partir du moment où tu veux écrire ne serait-ce
qu'une seule page web en autre chose qu'US-ASCII, tu ne peux pas
ignorer les histoires de charset.

mais là ça bugue...


Normal...

Voici un lien à lire absolument. Par chance il a été traduit en
français, et de plus il se lit facilement :
<http://french.joelonsoftware.com/Articles/Unicode.html>.


Avatar
Thierry
Olivier Miakinen <om+ écrivait
news:e2d9vi$150g$:

Mauvaise réponse. À partir du moment où tu veux écrire ne serait-ce
qu'une seule page web en autre chose qu'US-ASCII, tu ne peux pas
ignorer les histoires de charset.


J'ai lu sur le lien plus bas que les browser arrivait a deviner le charset
en fonction de la fréquence des caractères etc.
Jusqu'a présent ça marchait gràce a ça.

mais là ça bugue...


Normal...

Voici un lien à lire absolument. Par chance il a été traduit en
français, et de plus il se lit facilement :
<http://french.joelonsoftware.com/Articles/Unicode.html>.


Interessant. Donc si je comprends bien il faut que les pages utilise le
même codage que la base de donnée.
Ca peut etre ISO-8859-1{5} sauf si on veut supporter les langages
exotiques.

Et si je continue de bien comprendre, JSON rajoute une contrainte en
travaillant en UTF-8, donc pour l'utiliser il faut que les pages soient en
UTF-8 et MySql soit en utf8_unicode_ci.

C'est ça ?

En tout cas merci pour ton aide et les explications.


Avatar
Olivier Miakinen

J'ai lu sur le lien plus bas que les browser arrivait a deviner le charset
en fonction de la fréquence des caractères etc.


Seulement s'ils sont configurés pour le faire (dans Mozilla, par
exemple, c'est Affichage / Encodage des caractères / Détection
automatique / Universel, mais ce choix n'est pas configuré par
défaut).

<http://french.joelonsoftware.com/Articles/Unicode.html>.


Interessant. Donc si je comprends bien il faut que les pages utilise le
même codage que la base de donnée.


Disons que cela simplifie le travail du webmestre, mais ce n'est bien
sûr pas obligatoire : si les codages sont différents, c'est à lui de
faire la traduction entre l'un et l'autre, dans les deux sens. Quand
on a le même codage partout cela évite de se prendre les pieds dans
le tapis.

Ca peut etre ISO-8859-1{5} sauf si on veut supporter les langages
exotiques.


Oui.

Et si je continue de bien comprendre, JSON rajoute une contrainte en
travaillant en UTF-8, donc pour l'utiliser il faut que les pages soient en
UTF-8 et MySql soit en utf8_unicode_ci.


Je ne connais pas JSON, mais si c'est un truc récent il serait assez
logique qu'il travaille en UTF-8 par défaut. Et s'il est en UTF-8, tu
dois soit avoir de l'UTF-8 partout, soit faire des transcodages à chaque
fois que tu échanges des données avec JSON.

C'est ça ?


Oui.

En tout cas merci pour ton aide et les explications.


C'était avec plaisir. Tiens, du coup j'en profite pour faire de la
pub pour une de mes pages (malheureusement ça ne me rapporte pas un
centime) : <http://www.miakinen.net/vrac/charsets/> te permettra de
connaître facilement le code UTF-8 de tout caractère Latin1.

Il y a une page encore plus intéressante, mais qui n'est pas de moi :
<http://people.w3.org/rishida/scripts/uniview.fr/conversion.html>.

--
Olivier Miakinen


Avatar
Thierry
Olivier Miakinen <om+ écrivait
news:e2e9g8$21qn$:

C'est ça ?


Oui.


Bon, ben ça marche bien.

Question subsidiaire : j'ai une requete AJAX qui renvoie le résultat d'une
commande DOS (ping). Quel charset utiliser ? (j'ai essayé utf, l'iso-8851
et windows-1252).


Avatar
Olivier Miakinen

Question subsidiaire : j'ai une requete AJAX qui renvoie le résultat d'une
commande DOS (ping). Quel charset utiliser ? (j'ai essayé utf, l'iso-8851
et windows-1252).


Sur les machines récentes dans les pays occidentaux, c'est CP850.
Voir <http://www.miakinen.net/vrac/charsets/>.

Avatar
Thierry
Olivier Miakinen <om+ écrivait
news:e2fo27$sd4$:

Question subsidiaire : j'ai une requete AJAX qui renvoie le résultat
d'une commande DOS (ping). Quel charset utiliser ? (j'ai essayé utf,
l'iso-8851 et windows-1252).


Sur les machines récentes dans les pays occidentaux, c'est CP850.
Voir <http://www.miakinen.net/vrac/charsets/>.


Au poil, merci beaucoup.


Avatar
Thierry
Thierry écrivait
news::

Oui.


Bon, ben ça marche bien.


Par contre phpMyAdmin m'affiche les caractères a la con quand j'affiche mes
tables :-(