使用MSXML 4.0读取UTF-8 XML

时间:2009-06-09 17:41:25

标签: asp-classic utf-8 character-encoding msxml

我的classc ASP / VBScript试图用MSXML读取UTF-8编码的XML文件时遇到问题。文件编码正确,我可以看到所有其他工具。

构造的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 个答案:

答案 0 :(得分:5)

Set ts = fso.OpenTextFile("input.xml", FOR_READING, False, True)

最后一个参数是“Unicode”标志。

OpenTextFile()具有以下签名:

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

其中“format”定义为

  

可选。用于表示格式的三个三态值之一   打开的文件。如果省略,则为文件   以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的方法。 MSXML对象的load()方法将能够处理所有这些方法。