2016-08-25 89 views
2

這個問題與這一個有關:Character encoding Microsoft.XmlHttp in Vbscript,但有一點不同,一個國家的字符在域名中,不僅是參數。MSXML2.ServerXMLHTTP和國家字符

任務是:從給定的URL下載頁面。

我已經解決了通過ADO從UTF8編碼文件中讀取UTF8字符串到VBScript中的問題。

但現在當我嘗試打開它時,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表示域名 - 但我還沒有發現用於vbscript的PunnyCode編碼器(除了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,更不用說[IRI直到2005年才被定義](https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier)。 – Lankymart

回答

2

我已經做了一個驚人的旅程深入我的硬盤驅動器,並找到了代碼/的Jesper Høy。這是當時SimpleDNS Plus'IDN轉換工具的源代碼。

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 

然後在提出請求之前轉換您的網址。

XMLHttpReq.Open "GET", DummyPuny(url), False 
+0

這太棒了!我開始着眼於編寫一個punycode實現,因爲我在ASP的任何地方找不到一個,但是當我意識到涉及到什麼並且沒有時間去正確的時候停下來。很好的答案! – Lankymart

+1

@Lankymart謝謝。我很高興你(當然是我)沒有再發明輪子。 –

+0

是的。我曾看過SimpleDNS Plus的IDN轉換工具,但沒有意識到它最初是用ASP編寫的,否則我可能已經走了WayBackMachine路線。 – Lankymart