[JavaScript] Spécification de l'encodage d'un document XML

Spécification de l'encodage d'un document XML [JavaScript] - HTML/CSS - Programmation

Marsh Posté le 05-12-2007 à 22:05:43    

Bonjour,
La question est simple : Comment définir l'encodage, en l'occurence utf-8, lors de la création d'un document XML ?
 
Le cadre :
J'envoie des données XML en utilisant la méthode AJAX (j'utilise la lib jQuery). Or, lors de la sérialisation du document XML, Firefox utilise l'encodage iso-8859-1 (a priori) et ne met d'ailleurs aucun prologue (<?xml [..] ?> ).
 
Voici un exemple :

Code :
  1. var doc = document.implementation.createDocument("", "action", null)
  2. var serializer = new XMLSerializer()
  3. alert(serializer.serializeToString(doc))


Ce code affiche "<action/>"
 
J'ai trouvé cette solution pour contourner le problème :

Code :
  1. var parser = new DOMParser();
  2. var doc = parser.parseFromString("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<action/>", "text/xml" )
  3. var serializer = new XMLSerializer()
  4. alert(this.serializeXML(doc))


Qui affiche
'<?xml version="1.0" encoding="utf-8" ?>
<action/>'
 
Je trouve cette solution abominable, est-ce que quelqu'un dans la salle aurait une solution plus élégante  ?
 
Je me suis référer à ce document ainsi qu'au livre "Javascript, la référence" de chez O'Reilly.
 
Ce problème est tiré d'un petit web chat que je suis en train de réaliser, cf cette page.
 
 
Merci d'avance pour vos réponses.


Message édité par Ummon le 05-12-2007 à 22:08:52
Reply

Marsh Posté le 05-12-2007 à 22:05:43   

Reply

Marsh Posté le 06-12-2007 à 10:00:32    

Citation :

Or, lors de la sérialisation du document XML, Firefox utilise l'encodage iso-8859-1 (a priori) et ne met d'ailleurs aucun prologue (<?xml [..] ?> ).


Le prologue XML n'est absolument pas obligatoire, et s'il n'existe pas (et que l'encodage n'est donc pas précisé) la spec XML indique que le document doit impérativement être en utf-8. D'où tires tu l'info que FF sérialise en iso-8859-1?

 

D'autre part, quel est l'intérêt de sérialiser le fichier xml reçu? Tu veux l'enregistrer sous forme de fichier en local?

Message cité 3 fois
Message édité par masklinn le 06-12-2007 à 10:01:22

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-12-2007 à 10:27:12    

masklinn a écrit :

Le prologue XML n'est absolument pas obligatoire, et s'il n'existe pas (et que l'encodage n'est donc pas précisé) la spec XML indique que le document doit impérativement être en utf-8. D'où tires tu l'info que FF sérialise en iso-8859-1?


Je l'ai simplement constaté en analysant les messages reçu par le serveur. Opera, au contraire, utilise bien l'utf-8.
Je ne savais pas que le prologue était facultatif, merci pour l'info.
 

masklinn a écrit :

D'autre part, quel est l'intérêt de sérialiser le fichier xml reçu? Tu veux l'enregistrer sous forme de fichier en local?


Je n'ai parlé ni de recevoir ni de fichier. Le client crée un document xml qu'il envoie au serveur à l'aide de XMLHttpRequest() via jQuery.ajax().
 
Le message posté sur le chat est composé à partir, entre autre, de l'input de l'utilisateur, tu peux tester ici : www.euphorik.ch/euphorik.
Si tu regardes le fichier js, tu verra que je suis obligé de faire une conversion explicite en utf-8 (voir la fonction to_utf8()). Sous Opera cette conversion n'est pas nécessaire puisqu'il travail déjà en utf-8.
 
Juste en passant : ma méthode de contournement ne fonctionne pas sous Konqueror, apparemment il ne considère pas mon document (parsé avec parseFromString()) comme valide. Quand c'est pas l'un c'est l'autre... vive le xml, j'aurai dû adopté le JSON, ça aurait été plus simple pour ce que je veux faire.


Message édité par Ummon le 06-12-2007 à 10:30:44
Reply

Marsh Posté le 06-12-2007 à 10:40:37    

Comment tu fais ta requête?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-12-2007 à 10:47:38    

Par exemple pour l'envoie d'un message de chat :
pageMinichat.js ligne ~191 :

Code :
  1. jQuery.post("request",  this.util.xmlVersAction(this.getXMLMessage(pseudo, message, repondA)),
  2.       function(data, textStatus)
  3.       {
  4.          // TODO : traiter les erreurs
  5.          jQuery("form input.message" ).val("" )
  6.       }
  7.    )


 
la fonction : getXMLMessage() construit le document XML comme décrit dans le post initial.


Message édité par Ummon le 06-12-2007 à 10:48:20
Reply

Marsh Posté le 06-12-2007 à 12:25:15    

En toute logique, un fichier XML généré en Ajax utilisera le charset de la page HTML qui englobe le script.
 
Je te conseille de regarder de ce côté en premier.

Reply

Marsh Posté le 06-12-2007 à 13:16:24    

MagicBuzz a écrit :

En toute logique, un fichier XML généré en Ajax utilisera le charset de la page HTML qui englobe le script.
 
Je te conseille de regarder de ce côté en premier.


Sans vouloir être méchant cette phrase "un fichier XML généré en Ajax" ne veut strictement rien dire. De plus je ne vois pas ce que l'encodage de la page HTML vient foutre la dedans, ta supposition est très aléatoire. De surcroît ma page utilise l'encodage utf-8.

Reply

Marsh Posté le 06-12-2007 à 14:05:36    

Ummon a écrit :


Sans vouloir être méchant cette phrase "un fichier XML généré en Ajax" ne veut strictement rien dire. De plus je ne vois pas ce que l'encodage de la page HTML vient foutre la dedans, ta supposition est très aléatoire. De surcroît ma page utilise l'encodage utf-8.


Et le JS, par défaut, n'accèpte que des données en utf-8.
 
C'est d'ailleurs pour ça que le comportement que tu observes me choque un peu :/


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-12-2007 à 15:29:10    

masklinn a écrit :

Le prologue XML n'est absolument pas obligatoire, et s'il n'existe pas (et que l'encodage n'est donc pas précisé) la spec XML indique que le document doit impérativement être en utf-8.


D'après wikipedia l'encodage sans prologue est soit de l'uft-8 ou soit de l'utf-16 ce qui n'est pas la même chose mais bon ca ne fait pas beaucoup avancer le schmilblick.
C'est quand même bizarre que

Code :
  1. alert("é".charCodeAt(0))

donne 233 (#E9) qui est a priori de l'iso-8859-1 (le fichier js est évidemment encodé en utf-8).
 
J'ai fait ce test : j'ai enlevé ma fonction pourrie "to_utf8" et posté "é" avec firefox puis opera, voila le resultat en BD :

(gb@overnux)8> minichat:messages(2).
[{minichat,140,3,{1196,950996,991986},"opera","\303\251"},
 {minichat,141,4,{1196,951004,543897},"firefox","\351"}]


La fonction minichat:message(N) renvoie les N derniers messages, les caractères spéciaux sont représentés en octal. On voit que opera me donne de l'utf-8 et que firefox me donne de l'iso-8859-1.
J'ai utilisé cette page pour voire les différents code de 'é'.
 
Conclusion : bein je ne suis toujours pas plus avancé  :D.


Message édité par Ummon le 06-12-2007 à 15:59:25
Reply

Marsh Posté le 07-12-2007 à 14:03:47    

question con : t'as vérifié l'encodage qu'utilise ton éditeur de texte ?
et l'encodage qu'envoie la page qui génère le xml ? (si c'est le cas)


---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Marsh Posté le 07-12-2007 à 14:03:47   

Reply

Marsh Posté le 07-12-2007 à 14:37:38    

cosmoschtroumpf a écrit :

question con : t'as vérifié l'encodage qu'utilise ton éditeur de texte ?
et l'encodage qu'envoie la page qui génère le xml ? (si c'est le cas)


ouaip, tout est en utf-8, le bouzin se trouve ici http://www.euphorik.ch/euphorik/

Reply

Marsh Posté le 07-12-2007 à 19:01:49    

Ummon a écrit :


ouaip, tout est en utf-8, le bouzin se trouve ici http://www.euphorik.ch/euphorik/

fake

Citation :

Server: Yaws/1.73 Yet Another Web Server
Date: Fri, 07 Dec 2007 17:59:37 GMT
Last-Modified: Tue, 04 Dec 2007 15:26:22 GMT
Etag: "18JBpYAM6jc"
Content-Length: 1942
Content-Type: text/html

y a pas d encoding spécifié et donc par defaut ca passe sur un encoding local iso-8859-1(5)


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 07-12-2007 à 21:08:20    

mIRROR a écrit :

y a pas d encoding spécifié...(5)


L'encodage est définit au niveau du document XHTML : "<?xml version="1.0" encoding="UTF-8" ?>"
Quant à l'encodage du fichier JavaScript et bien l'interpréteur s'en tape de son codage, ce qui compte c'est que je sais que le fichier js est en utf-8 et que l'affichage est en utf-8.
 

mIRROR a écrit :

...et donc par defaut ca passe sur un encoding local iso-8859-1


Ya une norme qui dit ça ? Il me semble que ça dépend de l'implémentation.
D'ailleurs si je regarde ce code Javascript avec Firefox : http://www.euphorik.ch/euphorik/js/euphorik.js, il me l'affiche en utf-8 par défaut bien qu'au niveau HTTP on en sache rien. Magie ?

Message cité 1 fois
Message édité par Ummon le 07-12-2007 à 21:09:41
Reply

Marsh Posté le 07-12-2007 à 23:38:37    

Ummon a écrit :


L'encodage est définit au niveau du document XHTML : "<?xml version="1.0" encoding="UTF-8" ?>"


 
sauf que si ton serveur sert tes pages en iso ca vaut pas un kopeck :/
et comme ta page est servie en text le prologue xml vaut rien  
 

Ummon a écrit :

le fichier js est en utf-8


 
peut etre
 

Ummon a écrit :

l'affichage est en utf-8


 
non
 

Ummon a écrit :


Ya une norme qui dit ça ? Il me semble que ça dépend de l'implémentation.


 
oui oui  et oui
le serveur override tout
 

Ummon a écrit :


D'ailleurs si je regarde ce code Javascript avec Firefox : http://www.euphorik.ch/euphorik/js/euphorik.js, il me l'affiche en utf-8 par défaut bien qu'au niveau HTTP on en sache rien. Magie ?


 
cherches toi des excuses si ca t amuse j essaie juste d aider hein :/


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 08-12-2007 à 13:31:43    

Ok pour tes remarques, je vais essayer de voir comment spécifier le charset... c'est pas gagner dans toute la doc de yaws il n'y a mention ni du mot 'encoding' ni du mot 'charset' ... super...
 
Tu crois que ca pourrait être à l'origine de mon problème ?

Reply

Marsh Posté le 08-12-2007 à 15:05:34    

tu génère ton xml en quel langage de prog ?


---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Marsh Posté le 08-12-2007 à 16:41:16    

cosmoschtroumpf a écrit :

tu génère ton xml en quel langage de prog ?


Euh... en Javascript...

Reply

Marsh Posté le 08-12-2007 à 16:46:49    

Reply

Marsh Posté le 08-12-2007 à 17:03:37    

masklinn a écrit :

Le prologue XML n'est absolument pas obligatoire

En XML 1.0, mais pas en XML 1.1, non?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-12-2007 à 17:11:02    


euh... t'as autre chose à me proposer ? Je ne vois aucune alternative...

Reply

Marsh Posté le 09-12-2007 à 02:38:17    

gilou a écrit :

En XML 1.0, mais pas en XML 1.1, non?
A+,


Aucune idée, ya des gens qui se basent sur 1.1 plutôt que 1.0 dans la vraie vie?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 09-12-2007 à 21:49:46    

Ummon a écrit :

euh... t'as autre chose à me proposer ? Je ne vois aucune alternative...


nan, c'est juste que c'était marqué en gros dans le titre, alors je me demandais bien pourquoi je posais la question :o
 
je connais pas assez bien le JS pour te répondre du coup, à part regarder la doc de ton serveur pour qu'il sorte de l'UTF-8 par défaut, mais apparament tu trouves pas de doc là-dessus... sinon, tout repasser en ISO, mais bon :D


---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux
Reply

Marsh Posté le 09-12-2007 à 21:58:13    

masklinn a écrit :

Aucune idée, ya des gens qui se basent sur 1.1 plutôt que 1.0 dans la vraie vie?


A mon avis, y'a 98% de gens qui savent même pas que ça existe. Ou qui pensent que les changements ne justifient pas de passer au 1.1....


Message édité par FlorentG le 09-12-2007 à 21:58:26
Reply

Marsh Posté le 09-12-2007 à 21:59:21    

masklinn a écrit :


Aucune idée, ya des gens qui se basent sur 1.1 plutôt que 1.0 dans la vraie vie?

Faut vivre avec son temps ;)
C'est une des diffs si je lis bien la spec: l'en tête <?xml version="1.1" ... ?> est obligatoire, meme pour les fragments, et meme pour le well formed.
S'il n'y a pas cela, alors c'est du XML 1.0
A+,

Message cité 1 fois
Message édité par gilou le 09-12-2007 à 22:02:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-12-2007 à 22:08:10    

gilou a écrit :

Faut vivre avec son temps ;)


Je vis avec mon temps, j'évite le XML autant que possible.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 09-12-2007 à 22:28:36    

masklinn a écrit :


Je vis avec mon temps, j'évite le XML autant que possible.


Tu préconiserais quoi dans un cas d'échange de messages simples entre serveur et clients (genre un peu ce que je suis en train de faire) ? JSON ? YAML ? texte brut ? binaire ? ...

Reply

Marsh Posté le 09-12-2007 à 22:42:54    

json :o


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
Reply

Marsh Posté le 10-12-2007 à 07:59:58    

Ummon a écrit :


Tu préconiserais quoi dans un cas d'échange de messages simples entre serveur et clients (genre un peu ce que je suis en train de faire) ? JSON ? YAML ? texte brut ? binaire ? ...


JSON (+ REST si applicable), si pas suffisant monter au YAML, si pas assez efficace (besoin d'un protocole binaire) un truc genre ASN.1
 
Ca me semble un bon début :D


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 17-12-2007 à 00:31:14    

mise au point: j'ai posté dans la mauvaise discussion, celle-ci n'est pas exactement sur le même sujet.
Je laisse le message, car il peut être utile dans ce contexte aussi.
 
Il me semble que cette discussion part un peu dans tous les sens, sans que le point clé n'y ait été mentionné:
Pour que le code javascript soit interprété en UTF-8 il faut que le charset soit précisé pour le script, quel que soit l'encodage du document principal :
<script type="text/javascript" charset="UTF-8" src="moncode.js"/>


Message édité par Max_Barel le 17-12-2007 à 00:33:55
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed