近来很多人问我,如何使 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 联机库:与混合环境的兼容性问题)