2016-08-25 7 views
2

Этот вопрос относится к следующему: Character encoding Microsoft.XmlHttp in Vbscript, но в чем-то отличается, национальные символы находятся в доменном имени, а не только в аргументах.MSXML2.ServerXMLHTTP и национальные символы

Задача: загрузить страницу с данного 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 в UTF8 кодируются fileWithURL.txt сценарий вызовет ошибку во время работает нормально с hxxp: //google.com.

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

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

+0

Там нет ничего построено, чтобы сделать это вы должны либо попытаться построить алгоритм декодирования/кодирования себя * (имейте в виду, VBScript не играет хорошо с вещами на уровне байт) * или принять удар и используйте что-то вроде [ChillkatSoft] (https://www.example-code.com/vbscript/punycode.asp) или [Motobit ByteArray] (http://www.motobit.com/help/scptutl/cm440.htm) COM компоненты для тяжелого подъема для вас. – Lankymart

+0

Спасибо за быстрый ответ! Так что это действительно не работает, потому что это не так - это правильно? Другими словами, MSXML2.ServerXMLHTTP не поддерживает национальные символы в именах доменов, не так ли? Какой из двух предложенных кодеров вы бы посоветовали? –

+0

Ну ['IServerXMLHttpRequest'] (https://msdn.microsoft.com/en-us/library/ms762278 (v = vs.85) .aspx) был впервые выпущен как часть MSXML 3.0, поэтому мы говорим 15 лет или так и раньше, он никогда не был предназначен для обработки IRI только URI, не говоря уже о [IRI не был определен до 2005 года] (https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier). – Lankymart

ответ

2

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

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

Вы также можете скопировать весь код из this gist.

Создайте функцию для преобразования 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 
+0

Это потрясающе! Я намеревался написать реализацию punycode, поскольку я не мог найти нигде в Интернете для ASP, но остановился, когда понял, что было вовлечено, и просто не успел исправить ситуацию. Отличный ответ! – Lankymart

+1

@ Lankymart Спасибо. Я рад, что вы (и я, конечно) снова не изобретали колесо. –

+0

Да. Я посмотрел на SimpleNS Plus 'IDN Conversion Tool, но не понял, что он был первоначально написан в ASP, иначе я мог бы пойти по пути WayBackMachine. – Lankymart