Прочитайте UTF-8 XML с MSXML 4.0 - PullRequest
3 голосов
/ 09 июня 2009

У меня проблема с ASP / VBScript classc, который пытается прочитать XML-файл в кодировке UTF-8 с MSXML. Файл закодирован правильно, я вижу это со всеми другими инструментами.

Пример сконструированного XML:

<?xml version="1.0" encoding="UTF-8"?>
<itshop>
    <Product Name="Backup gewünscht" />
</itshop>

Если я попытаюсь сделать это в ASP ...

Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("input.xml", FOR_READING)
XML = ts.ReadAll
ts.Close
Set ts = nothing
Set fso = Nothing

Set myXML = Server.CreateObject("Msxml2.DOMDocument.4.0")
myXML.loadXML(XML)
Set DocElement = myXML.documentElement
Set ProductNodes = DocElement.selectNodes("//Product")
Response.Write ProductNodes(0).getAttribute("Name")
' ...

... и Name содержит специальные символы (немецкие умляуты, если быть точным), байты "двухбайтового кода" умлаутов перекодируются, поэтому я получаю два совершенно глупых бессмысленных символа. То, что должно быть «ü», становится «¼¼» - в моем выводе ЧЕТЫРЕ байта, а не два (правильный UTF-8) или один (ISO-8859 - #).

Что я делаю не так? Почему MSXML думает, что ввод ISO-8859- #, поэтому он пытается преобразовать его в UTF-8?

1 Ответ

5 голосов
/ 09 июня 2009
Set ts = fso.OpenTextFile("input.xml", FOR_READING, False, True)

Последний параметр - это флаг "Юникод".

OpenTextFile () имеет следующую подпись:

object.OpenTextFile(filename[, iomode[, create[, format]]])

где "формат" определяется как

Дополнительно. Одно из трех значений Tristate, используемых для указания формата открытый файл. Если опущен, файл открывается как ASCII.

А Tristate определяется как:

TristateUseDefault  -2   Opens the file using the system default.
TristateTrue        -1   Opens the file as Unicode.
TristateFalse        0   Opens the file as ASCII.

И -1 оказывается числовым значением True.

В любом случае, лучше это:

Set myXML = Server.CreateObject("Msxml2.DOMDocument.4.0")
myXML.load("input.xml")

Почему вы должны использовать объект TextStream для чтения в файле, который MSXML может отлично читать самостоятельно?

Объект TextStream также не имеет представления о кодировке фактического файла. В документах написано «Unicode», но существует более одного способа кодирования Unicode. Метод load() объекта MSXML сможет справиться со всеми из них.

...