2009-06-09 6 views
3

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

Изготовленный пример 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") 
' ... 

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

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

+0

Прописные высказывания VB заставляют мои глаза болеть ... – Tomalak

+0

Извините за это;) – BlaM

ответ

5
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. Метод load() объекта MSXML сможет справиться со всеми из них.

+0

Если я это сделаю, я получаю ошибку XML Parse. :( – BlaM

+0

Попробуйте вариант «myXML.load()». Если это не удается, файл не сформирован. – Tomalak

+0

Отлично, это работает. У меня была версия loadXML, потому что есть другой способ отправки XML (который добавив XML-код в поле формы). Предположим, я просто отключу эту опцию. В любом случае это будет не нужно, если есть функция загрузки :) – BlaM