Разбор XML-кода в кодировке UTF-8 в MSXML / ASP - PullRequest
1 голос
/ 17 сентября 2009

Я на приемном конце HTTP POST (x-www-form-urlencoded), где одно из полей содержит XML-документ. Мне нужно получить этот документ, посмотреть на пару элементов и сохранить его в базе данных (для дальнейшего использования). Документ имеет формат UTF-8 (и имеет соответствующий заголовок) и может содержать множество странных символов.

Когда я получаю данные, вот так:

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

все, что я могу вытащить из документа DOM, все еще находится в форме UTF-8. Например, этот документ (чрезвычайно упрощенно):

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

всегда выходит как

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

Если я посмотрю на xmlDoc.XML, я получу это:

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

Он удаляет кодировку из заголовка (поскольку любая строка, которую я использую в VBScript, является "независимой от кодирования", это имеет смысл), но это все же последовательность символов, представляющих документ в кодировке UTF-8.

Это как если бы MSXML не интересовался информацией о кодировке в заголовке. Это проблема с MSXML или с кодировкой почтовых данных? Это форма «двойного кодирования», сначала UTF-8 (где определенные символы записываются с несколькими байтами), а затем байтовое кодирование в байтах («ä» фактически отправляется как% C3% A4).

Я бы не хотел жестко кодировать что-либо, например, предполагая, что это всегда UTF-8 (как это может быть UTF-16 когда-нибудь в будущем). Я также не могу выполнить «жесткое преобразование» в любой другой набор символов (например, iso-8859-1), поскольку данные могут содержать символы кириллицы и арабского языка. Как мне исправить это?

Ответы [ 2 ]

3 голосов
/ 17 сентября 2009

Вариант 1

Перед прочтением любых полей формы измените значение Response.CodePage: -

Response.CodePage = 65001

Проблема в том, что содержимое формы не воспринимается принимающей страницей как кодировка UTF-8. Следовательно, данные% C3% A4 рассматриваются как два разных символа ANSI. Страницы Response.CodePage странным образом влияют на способ декодирования данных формы при отсутствии информации о наборе символов, отправленной клиентом.

Вариант 2

Изменить элемент формы на исходной странице. Добавьте к нему следующий атрибут: -

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

Это обеспечивает кодировку символов UTF-8 в сообщении и заставляет сообщение переносить данные о выбранном наборе символов, что дает серверу информацию, необходимую для правильного декодирования данных.

Вариант 3

Наконец, мои личные предпочтения - не публиковать XML как значения полей в форме. Вместо этого переверните его, добавив другие значения полей формы в качестве атрибутов или элементов в XML, а затем отправьте XML, используя XmlHttpRequest. Для навигации сервер должен вернуть URL-адрес, по которому должен перейти клиент, который будет содержать дескриптор GUID для опубликованных данных, чтобы, когда сервер получил запрос, он мог предпринять соответствующее действие. Однако я понимаю, что это все еще немного больше работы, и в этом случае один из двух других вариантов должен работать для вас.

0 голосов
/ 17 сентября 2009

Вариант 3 в настоящее время может быть в значительной степени исключен из-за дополнительной сложности такого переписывания.

Вариант 1 просто кажется мне странным, что кодовая страница ответа должна определять, что происходит с запросом, но если это так, то так и будет.

Что касается варианта 2, на самом деле это не публикация в форме браузера, а небольшой клиент сценариев (с использованием CURL). Каким будет полученный в результате HTTP-заголовок, который можно добавить в сценарий запроса?

В общем, я думаю, это означает, что MSXML просто игнорирует любую кодировку, установленную в заголовке xml при загрузке из строки.

...