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

...そして名前には特殊文字(具体的にはドイツ語のウムラウト)が含まれているため、ウムラウトの「2バイトコード」のバイトが再エンコードされるため、2つのまったくくだらないナンセンス文字になります。"ü" は "ü" になります - 私の出力では 4 バイトであり、2 つ (正しい UTF-8) または 1 つ (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]]])

ここで、「フォーマット」は次のように定義されます

オプション。開いているファイルの形式を示すために使用される 3 つの Tristate 値の 1 つ。省略した場合、ファイルは 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")

TextStreamMSXML がそれ自体で完全に読み取ることができるファイルを読み取るためにオブジェクトを使用する必要があるのはなぜですか。

オブジェクトには、実際のファイル エンコーディングのTextStream概念もありません。ドキュメントには「Unicode」と書かれていますが、Unicode をエンコードする方法は複数あります。MSXML オブジェクトのメソッドは、それらすべてを処理できます。load()

于 2009-06-09T17:46:05.537 に答える