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