vbscript尝试读取RSS源有问题的系统不支持指定的编码

时间:2010-12-02 07:49:53

标签: xml asp-classic vbscript rss

我正在尝试使用客户端的网址来显示我们网站上的Feed。我遇到的问题是它们的应用程序似乎是用java编写的,而XML响应的编码是ISO8859_1,这是MSXML活动x对象不支持的编码。请参阅此链接以供参考:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q304625

问题是,我非常怀疑我是否能够更改,甚至请求更改响应xml的编码。还有其他的解决方法吗?

CODE

Function GetXmlDom(pUrl)
        Set GetXmlDom = Server.CreateObject("MSXML2.DOMDocument")
        GetXmlDom.async = False
        GetXmlDom.setProperty "ServerHTTPRequest", True
        GetXmlDom.load(pUrl)

End Function

它将首先显示看起来很好的所有标题。然后我得到这个错误:

错误代码1072896658 Reason System不支持指定的编码。 系统错误:-1072896658。

如果我在浏览器中导航到同一个URL,它会正确显示XML文档。

您能否为相同的

建议解决方案

谢谢, 罗希特夏尔

1 个答案:

答案 0 :(得分:1)

  

我非常怀疑我是否能够更改,甚至要求更改响应xml的编码。

嗯,它坏了。 The IANA says ISO-8859-1的规范名称为ISO-8859-1。和ISO8859_1不是它的合法别名。要实践良好的互联网公民身份,您应该请求更改。指出它已经坏了,并要求修复。为了实践良好的公民身份,您的客户应该修复该错误。

ISO8859_1是我最初在Java库代码中使用的名称,作为映射到ISO-8859-1的名称。这种用法很好,虽然我不理解映射的必要性。但是从那里人们认为Java使用的内部名称实际上是编码名称 - 不是真的。它实际上只是Java所知的别名。然后,这种错误的信念传播到Java之外的其他库和框架,这些库和框架错误地认为如果Java使用ISO8859_1作为编码名称,它必须是正确的。底线是ISO8859_1不应该用于需要IANA编码字符串的实际xml文档中。


与此同时......

  

如果我在浏览器中导航到同一个URL,它会正确显示XML文档。

这不是我得到的。使用它作为rss源:

<?xml version="1.0" encoding="ISO8859_1"?>
<rss version="2.0">
  <channel>
<title>FeedForAll Sample Feed</title>
<description>RSS is a fascinating technology. ....</description>
 ...

我在IE8中得到了这个结果:

alt text

要在vbscript中阅读,您需要将ISO8859_1替换为ISO-8859-1。使用ServerHTTPRequest对象非常简单。

Function UrlGet(url)
    Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    xmlhttp.open "GET", url, False
    xmlhttp.send
    '' treat the output as plain text. We know it may be broken.
    UrlGet = xmlhttp.responseText
End Function


Dim url
url = "http://localhost/misc/broken.rss"

'' the above URL starts with an XML declaration of
''    <?xml version="1.0" encoding="ISO8859_1"?>
'' ... which is invalid, because ISO8859_1 is not a valid
'' name for an XML encoding.

Dim urlText
urlText = UrlGet(url)

'' replace the encoding with what we think it should be
urlText = Replace(urlText,"encoding=""ISO8859_1""","encoding=""ISO-8859-1""")

Set doc1 = CreateObject("Msxml2.DOMDocument.6.0")
doc1.async = False
doc1.preserveWhiteSpace= False ' True
doc1.loadXml(urlText)