使用MSXML 4.0读取UTF-8 XML

Bla*_*laM 3 msxml utf-8 character-encoding asp-classic

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

构造的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<itshop>
    <Product Name="Backup gewünscht" />
</itshop>
Run Code Online (Sandbox Code Playgroud)

如果我尝试在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")
' ...
Run Code Online (Sandbox Code Playgroud)

...和Name包含特殊字符(特定的德语变音符号)变音符号"双字节代码"的字节被重新编码,所以我最终得到两个完全糟糕的无意义字符.什么应该是"ü"变成"¼" - 在我的输出中是四个字节,而不是两个(正确的UTF-8)或一个(ISO-8859-#).

我究竟做错了什么?为什么MSXML认为输入是ISO-8859-#以便它尝试将其转换为UTF-8?

Tom*_*lak 5

Set ts = fso.OpenTextFile("input.xml", FOR_READING, False, True)
Run Code Online (Sandbox Code Playgroud)

最后一个参数是"Unicode"标志.

OpenTextFile()具有以下签名:

object.OpenTextFile(filename[, iomode[, create[, format]]])
Run Code Online (Sandbox Code Playgroud)

其中"格式"定义为

可选的.三个三态值之一用于指示打开文件的格式.如果省略,则文件以ASCII格式打开.

而三态定义为:

TristateUseDefault  -2   Opens the file using the system default.
TristateTrue        -1   Opens the file as Unicode.
TristateFalse        0   Opens the file as ASCII.
Run Code Online (Sandbox Code Playgroud)

-1恰好是数值True.

无论如何,更好的是:

Set myXML = Server.CreateObject("Msxml2.DOMDocument.4.0")
myXML.load("input.xml")
Run Code Online (Sandbox Code Playgroud)

为什么要使用一个TextStream对象来读取MSXML可以完全读取的文件.

TextStream对象也没有实际文件编码的概念.文档说"Unicode",但有不止一种编码Unicode的方法.load()MSXML对象的方法将能够处理所有这些.