2009-09-17 12 views
1

Je suis à la réception d'un HTTP POST (x-www-form-urlencoded), où l'un des champs contient un document XML. J'ai besoin de recevoir ce document, de regarder quelques éléments et de les stocker dans une base de données (pour une utilisation ultérieure). Le document est au format UTF-8 (avec l'en-tête approprié) et peut contenir beaucoup de caractères étranges.Analyse de code XML codé en UTF-8 dans MSXML/ASP

Quand je reçois les données, comme ceci:

Set xmlDoc = CreateObject("MSXML2.DOMDocument.3.0") 
xmlDoc.async = False 
xmlDoc.loadXML(Request.Form("xml")) 

tout ce que je peux creuser du document DOM est encore sous forme UTF-8. Par exemple, ce document (grossièrement simplifié):

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
ä 
</data> 

est toujours comme

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
ä 
</data> 

Si je regarde xmlDoc.XML, je reçois ceci:

<?xml version="1.0"?> 
<data> 
ä 
</data> 

Il supprime le codage de l'en-tête (puisque toute chaîne que j'utilise dans VBScript est "encoding-agnostic", ce genre de logique), mais c'est quand même une séquence de caractères représentant un codage UTF-8 document. C'est comme si MSXML ne se souciait pas de l'information d'encodage dans l'en-tête. Est-ce que le problème avec MSXML, ou est-ce avec l'encodage des données post? C'est une forme de "double encodage", d'abord UTF-8 (où certains caractères sont écrits avec plusieurs octets) et puis encodés octet par octet ("ä" est en fait envoyé en% C3% A4).

Je ne voudrais pas coder en dur quelque chose comme en supposant que c'est toujours UTF-8 (car il pourrait bien être UTF-16 dans le futur). Je ne peux pas non plus faire de «conversion matérielle» à un autre jeu de caractères (tel que iso-8859-1), car les données peuvent contenir des caractères cyrilliques et arabes. Comment dois-je faire pour réparer cela?

Répondre

3

Option 1

Avant de lire tout champs de formulaire modifier votre valeur Response.CodePage: -

Response.CodePage = 65001 

Le problème est le contenu des données de formulaire ne sont pas compris par la page d'accueil être encodé en UTF-8. Par conséquent, les données% C3% A4 sont considérées comme deux caractères ANSI distincts. Les pages Response.CodePage influencent étrangement la façon dont les données de formulaire sont décodées en l'absence d'informations de jeu de caractères envoyées par le client.

Option 2

modifier l'élément de formulaire sur la page source. Ajoutez l'attribut suivant à lui: -

<form accept-charset="UTF-8" ...> 

Cette applique encodage UTF-8 des caractères dans le poste, et provoque le poste pour transporter des données sur le charset choisi, ce qui donne au serveur les informations dont il a besoin de décoder les données correctement.

Option 3

Enfin, ma préférence personnelle, ne postez pas de XML en tant que valeurs de champ sous une forme.Au lieu de cela, retournez-le, en ajoutant les autres valeurs de champ de formulaire en tant qu'attributs ou éléments au code XML, puis en publiant le code XML à l'aide de XmlHttpRequest. Pour la navigation, demandez au serveur de renvoyer une URL vers laquelle le client doit naviguer et qui contiendrait un identificateur GUID pour les données publiées afin que, lorsque le serveur reçoit la requête, il puisse prendre les mesures appropriées. Je me rends compte cependant que tout cela est un peu plus de travail, auquel cas, l'une des deux autres options devrait fonctionner pour vous.

0

L'option 3 peut être pratiquement exclue pour le moment en raison de la complexité supplémentaire d'une telle réécriture.

L'option 1 me semble étrange, que la page de codes de la réponse devrait dicter ce qui se passe avec la requête, mais si c'est comme ça, alors qu'il en soit ainsi. En ce qui concerne l'option 2, ce n'est pas vraiment une publication de formulaire de navigateur, mais un petit client de script (en utilisant CURL). Quel serait l'en-tête HTTP résultant de cela, qui pourrait être ajouté à la requête scriptée? Je suppose que cela signifie que MSXML ignore simplement tout codage défini dans l'en-tête XML lors du chargement à partir d'une chaîne.

+0

@ionn: Je suis un peu confus fais-tu partie d'une équipe avec @jstck? Pour l'option 2, vous pouvez essayer d'ajouter l'en-tête "Accept-Charset: UTF-8" aux en-têtes de requête envoyés. Cependant, c'est aussi un peu bizarre, car il indique en fait ce que le jeu de caractères __response__ requis devrait être. Je trouve l'option 1 plus fiable. Je ne connais pas CURL mais dans les environnements de script, l'option 3 est préférable, CURL est peut-être différent. – AnthonyWJones