使用MSXML 4.0读取UTF-8编码的XML

3

我在使用经典的ASP/VBScript读取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")
' ...

当名称包含特殊字符时(具体来说是德语变音符),该变音符的“两个字节代码”会被重新编码,因此最终输出的两个无意义字符非常糟糕。本应为“ü”的字符成为了“ü”,输出的字节数变成了四个字节,而不是两个字节(正确的UTF-8)或一个字节(ISO-8859-#)。
我做错了什么?为什么MSXML认为输入是ISO-8859-#,因此尝试将其转换为UTF-8?

大写的VB语句让我眼睛疼... - Tomalak
1个回答

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


尝试使用“myXML.load()”变量。如果这也失败了,那么文件格式不正确。 - Tomalak
太好了,它可行。我之前使用的是loadXML版本,因为还有另一种提交XML的方式(即将XML代码插入表单字段中)。我想我会禁用那个选项。如果有上传功能,那么也不需要其他方法了 :) - BlaM
你也可以将它包含在一个If .. Then ... Else语句中。 :-) - Tomalak
确认:现在一切都按预期工作。感谢您的大力帮助! - BlaM
myXML.load("input.xml") 这种写法有点傻,括号不应该放在那里。这种习惯很不好,会在其他地方给你带来麻烦。FSO 只能处理 ASCII 和“Unicode”(即 UTF-16LE)。当您想要读取/写入替代文本编码或二进制数据时,请考虑使用 ADODB.Stream。它非常方便且多才多艺。但在这种情况下完全不需要。 - Bob77
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接