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