【问题标题】:MSXML2.ServerXMLHTTP and national charactersMSXML2.ServerXMLHTTP 和国家字符
【发布时间】:2017-01-01 22:29:33
【问题描述】:

这个问题与这个问题有关:Character encoding Microsoft.XmlHttp in Vbscript,但有一点不同,国家字符在域名中,而不仅仅是参数。

任务是:从给定的 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 编码的文件WithURL.txt 中,脚本将在使用 hxxp 时引发错误: //google.com.

解决方法是使用域名的 ascii 表示 - 但我还没有找到用于 vbscript 的 PunnyCode 编码器(除了Chillkat,这对我的任务来说是多余的)。

感谢您对主要问题或解决方法的帮助。

【问题讨论】:

  • 没有任何内置功能可以做到这一点,您必须自己尝试构建解码/编码算法(请记住 VBScript 不能很好地处理字节级的东西) i> 或者接受打击并使用类似ChillkatSoftMotobit ByteArray COM 组件来为您完成繁重的工作。
  • 感谢您的快速响应!所以它真的不起作用,因为它不应该 - 它是否正确?换句话说,MSXML2.ServerXMLHTTP 不支持域名中的国家字符,是吗?您会建议两种编码器中的哪一种?
  • 好吧,IServerXMLHttpRequest 最初是作为 MSXML 3.0 的一部分发布的,所以我们谈论的是 15 年前左右,它从未被设计用于处理 IRI 唯一的 URI,更不用说 IRI wasn't defined until 2005
  • 任何一个 COM 组件都应该达到目的,因为我没有使用过任何一个我都不想评论。
  • @Lankymart 而不是 MSXML 的年龄,它必须与 MSXML 所依赖的 Windows API 相关。例如,在 Windows 10 上,我对 IRI 没有任何问题。你知道,构建很重要。记住this similar behaviour

标签: utf-8 vbscript serverxmlhttp punycode


【解决方案1】:

我在硬盘驱动器的深度进行了一次惊人的旅程,并找到了 / 为 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

【讨论】:

  • 这太棒了!我开始考虑编写一个 punycode 实现,因为我在 Web 上的任何地方都找不到用于 ASP 的实现,但是当我意识到所涉及的内容并且没有时间把它做好时就停止了。很好的答案!
  • @Lankymart 谢谢。我很高兴你(当然还有我)没有再次发明轮子。
  • 是的。我确实看过 SimpleDNS Plus 的 IDN 转换工具,但没有意识到它最初是用 ASP 编写的,否则我可能会走 WayBackMachine 路线。
  • 非常感谢!我从您的 ASP 中提取了非 HTML 部分,它也可以用作命令行 vbs!同时为了解决我的问题,我编写了 C# 工具,它运行良好,由一行(加上支持人员)组成:string convertedURL = uri.GetComponents(UriComponents.Scheme | UriComponents.KeepDelimiter, UriFormat.UriEscaped) + uri.DnsSafeHost + uri.AbsolutePath;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2010-11-12
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多