vbscript пытается прочитать RSS-каналы, проблема в системе не поддерживает указанную кодировку - PullRequest
0 голосов
/ 02 декабря 2010

Я пытаюсь использовать URL клиента для показа каналов на нашем сайте.Проблема, с которой я столкнулся, заключается в том, что кажется, что их приложение было написано на Java, а код ответа XML - ISO8859_1, кодировка, которая не поддерживается активным объектом MSXML.Пожалуйста, смотрите эту ссылку для справки: 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 Причина Система не поддерживает указанную кодировку.Системная ошибка: -1072896658.

Если я перехожу по тому же URL-адресу в моем браузере, он отлично отображает документ XML.

Можете ли вы предложить решение для того же

Спасибо, Рохит

1 Ответ

1 голос
/ 02 декабря 2010

Я очень сомневаюсь, что смогу изменить или даже запросить изменение кодировки ответа xml.

Ну, это сломано. IANA сообщает , что каноническое имя для ISO-8859-1 - ISO-8859-1.и ISO8859_1 не является легальным псевдонимом для него.Чтобы практиковать хорошее интернет-гражданство, вы должны запросить изменение.Укажите, что он сломан, и попросите исправить.Чтобы практиковать хорошее гражданство, ваш клиент должен исправить эту ошибку.

ISO8859_1 - это имя, которое первоначально использовалось, я думаю, в коде библиотеки Java, как имя, которое сопоставлено с ISO-8859-1.Это использование было хорошо, хотя я не понимаю необходимость картирования.Но оттуда люди предположили, что внутреннее имя, которое использует Java, на самом деле является именем кодировки, а не истиной.Это действительно псевдоним, известный только Java.И затем это ошибочное убеждение распространилось на другие библиотеки и платформы за пределами Java, которые неверно предполагали, что если Java использует ISO8859_1 в качестве имени кодировки, оно должно быть правильным.Суть в том, что ISO8859_1 не следует использовать в реальных XML-документах, где ожидается строка кодирования IANA.


А пока ...

Если я перехожу по тому же 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)
...