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 в файл с кодировкой UTF8WithURL.txt, скрипт выдаст ошибку, при этом нормально работая с hxxp://google .com.

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

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


person Denis K.    schedule 25.08.2016    source источник
comment
Для этого нет ничего встроенного, вам придется либо попытаться создать алгоритм декодирования/кодирования самостоятельно (имейте в виду, что VBScript плохо работает с вещами на уровне байтов), либо принять удар и использовать что-то вроде ChillkatSoft или Motobit ByteArray компоненты COM, которые сделают всю тяжелую работу за вас.   -  person user692942    schedule 25.08.2016
comment
Спасибо за быстрый ответ! Так что это действительно не работает, потому что не должно - это правильно? Другими словами, MSXML2.ServerXMLHTTP не поддерживает национальные символы в доменных именах, не так ли? Какой из двух предложенных энкодеров вы бы посоветовали?   -  person Denis K.    schedule 25.08.2016
comment
Итак, IServerXMLHttpRequest впервые был выпущен как часть MSXML 3.0, так что мы говорим 15 лет назад или около того, он никогда не предназначался для работы с IRI, только с URI, не говоря уже о IRI не был определен до 2005 года.   -  person user692942    schedule 25.08.2016
comment
Любой COM-компонент должен служить этой цели, поскольку я не использовал его и не хотел бы комментировать.   -  person user692942    schedule 25.08.2016
comment
@Lankymart, а не возраст MSXML, это должно быть что-то связанное с Windows API, на который опирается MSXML. Например, в Windows 10 у меня нет проблем с IRI. Вы знаете, билды имеют большое значение. Помните подобное поведение.   -  person Kul-Tigin    schedule 26.08.2016
comment
@ Kul-Tigin Я бы просто предположил, что сделал свою лучшую детективную работу, основываясь на том, что смог найти. Также согласитесь, что это, вероятно, связано с ОС.   -  person user692942    schedule 26.08.2016


Ответы (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
person Kul-Tigin    schedule 26.08.2016
comment
Это круто! Я начал искать реализацию punycode, так как нигде не мог найти ее для ASP в Интернете, но остановился, когда понял, в чем дело, и у меня просто не было времени, чтобы сделать это правильно. Отличный ответ! - person user692942; 26.08.2016
comment
@Lankymart Спасибо. Я рад, что вы (и я, конечно) снова не изобрели велосипед. - person Kul-Tigin; 26.08.2016
comment
Ага. Я просмотрел Инструмент преобразования IDN SimpleDNS Plus, но не понял, что он изначально был написан на ASP, иначе я мог бы пойти по пути WayBackMachine. - person user692942; 26.08.2016
comment
Большое тебе спасибо! Я взял не-HTML часть из вашего ASP, и она также работает как командная строка vbs! Тем временем, чтобы решить мою проблему, я написал инструмент C#, который прекрасно работает и состоит из одной строки (плюс вспомогательный персонал): string convertedURL = uri.GetComponents(UriComponents.Scheme | UriComponents.KeepDelimiter, UriFormat.UriEscaped) + uri.DnsSafeHost + uri.AbsolutePath; - person Denis K.; 29.08.2016