MSXML2.ServerXMLHTTP и национальные символы

Этот вопрос связан с этим: кодировка символов Microsoft.XmlHttp в Vbscript, но отличается только тем, что национальные символы находятся в имени домена, а не только в аргументах.

Задача: скачать страницу с данного URL.

Я уже решил проблему передачи строки UTF8 в VBScript, прочитав ее из файла в кодировке UTF8 через ADO.

Но теперь, когда я пытаюсь открыть его, MSXML2.ServerXMLHTTP возвращает ошибку: URL-адрес недействителен.

Вот код VBScript:

Set objStream = CreateObject("ADODB.Stream")
objStream.CharSet = "utf-8"
objStream.Open
objStream.LoadFromFile("fileWithURL.txt")
url = objStream.ReadText()
objStream.Close

Set XMLHttpReq = CreateObject("MSXML2.ServerXMLHTTP")
XMLHttpReq.Open "GET", url, False
XMLHttpReq.send
WEBPAGE = XMLHttpReq.responseText

Если вы поместите что-то вроде hxxp://россия.рф/main/page5.html в файл UWF8 в кодировке UTF8, скрипт выдаст ошибку при нормальной работе с hxxp: //google.com.

Обходной путь должен использовать ascii представление доменного имени - но я еще не нашел кодировщик PunnyCode для vbscript (кроме Chillkat, который является излишним для моей задачи).

Буду признателен за помощь в решении основной проблемы или обходного пути.

1 ответ

Решение

Я совершил удивительное путешествие вглубь своего жесткого диска и нашел код, написанный / для Jesper Høy. Это был исходный код средства преобразования IDN SimpleDNS Plus.

Снимок страницы Archive.org: http://web.archive.org/web/20060423164021/http://www.simpledns.com/idn-convert.asp
Снимок файла Archive.org: idn-convert-asp.zip

Вы также можете скопировать весь код из этой сущности.

Создайте функцию для преобразования URL-адресов.

Function DummyPuny(ByVal url)
    Dim rSegments : rSegments = Split(url, "/")

    If UBound(rSegments) > 1 Then
        rSegments(2) = DomainPunyEncode(rSegments(2))
    End If

    DummyPuny = Join(rSegments, "/")
End Function

Затем преобразуйте ваш URL, прежде чем сделать запрос.

XMLHttpReq.Open "GET", DummyPuny(url), False
Другие вопросы по тегам