3

我在尝试使用 MSXML 读取 UTF-8 编码的 XML 文件时遇到了 classc ASP / VBScript 的问题。该文件已正确编码,我可以使用所有其他工具看到这一点。

构造的 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")
' ...

...并且名称包含特殊字符(具体是德语变音符号)变音符号“双字节码”的字节被重新编码,所以我最终得到了两个完全蹩脚的废话字符。应该是“ü”变成“ü” - 在我的输出中是四个字节,而不是两个(正确的 UTF-8)或一个(ISO-8859-#)。

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

4

1 回答 1

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

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

OpenTextFile() 具有以下签名:

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

其中“格式”定义为

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

三态定义为:

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()方法将能够处理所有这些。

于 2009-06-09T17:46:05.537 回答