近來很多人問我,如何使 XML 文件在不同的平臺間正確地傳遞數據。他們創建了 XML 文檔,鍵入了數據,粘上了幾個標記,調整了標記的格式,甚至放入了 <?xml version="1.0"?> 聲明,作為額外增添。然后他們試著裝載它,可得到的卻是意想不到的出錯消息,Microsoft(R) XML Parser (MSXML) 報告說數據有問題。對初編 XML 者來說,這真令人沮喪。難道它竟不能正常工作嗎?
經過幾十年關于跨平臺編程技術的研究,當今(而且可能在未來的很長一段時期內)唯一的真正跨平臺解決方案是通過簡單的標準數據格式得到的。Web 的成功正是建立在這種格式上的。在 Web 服務器和 Web 瀏覽器之間傳遞的主要內容是 HTTP 標題和 HTML 頁,兩者都是標準的文本格式。
在以下幾節中,我將討論字符編碼和標準字符集、Unicode、HTML Content-Type 標題、HTML Content-Type 元標記和字符實體。如果您熟悉上述概念,可跳過這些內容去讀 encoding XML data for the XML Document Object Model (DOM) PRogrammer(針對 XML 文檔對象模型 (DOM) 編程人員的編碼 XML 數據)的提示和技巧。有關詳細信息,請參閱 XML and Character Encoding(XML 和字符編碼)。
關于字符編碼 標準文本格式是建立在標準字符集之上的。要記住,所有的計算機均將文本存儲為數字。然而,不同的系統也可以用不同的數字存儲相同的文本。下表顯示了一組字節是如何被存儲的,第一個是使用默認代碼頁 1252、運行 Microsoft Windows(R) 的典型計算機,第二個是使用 Macintosh Roman 代碼頁的典型 Apple(R) Macintosh(R) 計算機。
Byte Windows Macintosh 140 Œ å 229 å  231 ç Á 232 è Ë 233 é È
比方說,如果您的祖母從 http://www.barnesandnoble.com/(英文)訂購了一本新書,她不會想到她的 Macintosh 計算機存儲字符的方式,并不同于運行 www.barnesandnoble.com(英文)的新 Windows 2000 Web 服務器。在往 Internet 訂購單的發貨欄中輸入瑞典家中的地址時,她相信 Internet 會正確地傳遞字符 å(在其 Macintosh 上的字節值是 140),并沒想到接收和處理她發送消息的計算機會將字節值 140 轉換為字母 Œ。
用 MSXML 創建新的 XML 文檔 一旦加載了 XML 文檔,即可用 DOM 處理 XML 文檔,而不必考慮任何編碼問題,因為文檔是作為 Unicode 存儲在內存中的。所有 XML DOM 接口都是基于 COM BSTR 的,后者是雙字節的 Unicode 字串。這就是說,您可以從新開始在包含所有 Unicode 字符的內存中建立 MSXML DOM 文檔,并且所有組建將會共享該內存中的 DOM,而不會對 Unicode 字符值的意思有任何疑惑。然而,當對其進行保存時,MSXML 將以默認方式按 UTF-8 編碼所有數據。例如,假設您進行了以下處理:
var xmldoc = new ActiveXObject("Microsoft.XMLDOM") var e = xmldoc.createElement("test"); e.text = "å; xmldoc.appendChild(e); xmldoc.save("foo.xml");
下列 UTF-8 編碼文件的結果是:
<test>Ã¥</test>
注意 上述例子只有當在瀏覽器以外的環境運行時,才有效。由于受到安全限制,在瀏覽器里調用 Save 方法將不會產生相同的結果。
var xmldoc = new ActiveXObject("Microsoft.XMLDOM") xmldoc.load("foo.xml"); if (xmldoc.documentElement.text.charCodeAt(0) == 229) { WScript.echo("Yippee - it worked !!"); }
要想更改 XML DOM Save 方法使用的編碼,需要用如下位于文檔頂部的編碼屬性創建 XML 聲明:
var pi = xmldoc.createProcessingInstruction("xml", " version='1.0' encoding='ISO-8859-1'"); xmldoc.appendChild(pi);
結論 但愿本文有助于解釋字符編碼的工作原理,特別是在 XML 和 MSXML DOM 中的工作原理。一旦您理解了字符集編碼,它是相當簡單的,而且 XML 是非常出色的,因為它在這方面未留有絲毫含糊的余地。盡管 MSXML DOM 有幾處怪異需要密切留意,但它仍不失為一個能讓您讀取和寫入任何 XML 編碼的強大工具。
有關詳細信息 Microsoft MSDN Online Library: XML DOM Reference(Microsoft MSDN 聯機庫:XML DOM 引用)
Character Encoding Model(字符編碼模型),作者:Ken Whistler 和 Mark Davis
IANA Character Sets(IANA 字符集)
http://www.ietf.org(英文)的 Internet Engineering Task Force (IETF) 提供了 RFC 列表
Microsoft MSDN Online Library: Compatibility Issues with Mixed Environments(Microsoft MSDN 聯機庫:與混合環境的兼容性問題)