2009-06-09 34 views
3

我嘗試使用MSXML讀取UTF-8編碼的XML文件的classc ASP/VBScript出現問題。該文件編碼正確,我可以看到與所有其他工具。使用MSXML 4.0讀取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?

+0

大寫的VB語句讓我的眼睛受傷... – Tomalak 2009-06-09 17:50:09

+0

對不起;) – BlaM 2009-06-09 17:51:42

回答

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()方法將能夠處理所有這些方法。