首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

天极网 > 软件频道 > 设计在线 > 网页UI设计 >xml的编码技术(下)

xml的编码技术(下)

2000-08-08 00:00作者:-出处:微软责任编辑:

span class=90v>字符集和 MSXML DOM

  现在,讨论过不同的字符编码方法之后,让我们来看看如何在 MSXML DOM 中加载 XML 文档,以及当碰到模糊编码的字符时,可能收到的出错消息的类型。加载 XML DOM 文档的两个主要方法是 LoadXML 方法和 Load 方法。

LoadXML 方法总是采用只在 UCS-2 或 UTF-16 中编码的 Unicode BSTR。如果将非有效的 Unicode BSTR 的内容传递给 LoadXML,则加载会失败。

Load 方法可将以下内容当作 VARIANT:

Value Description
URL 如果 VARIANT 是 BSTR,则将其理解为 URL。
VT_ARRAY | VT_UI1 VARIANT 也可以是包含原始编码字节的 SAFEARRAY。
IUnknown 如果 VARIANT 是 IUnknown 接口,则 DOM 文档为 IStreamIPersistStreamIPersistStreamInit 调用 QueryInterface

Load 方法实现以下算法,用于确定 XML 的字符编码或字符集。

  • 如果 Content-Type HTTP 标题定义了字符集,该字符集则替代 XML 文档本身的所有内容。因为没有 HTTP 标题,所以这显然不适用于 SAFEARRAY 和 IStream 机制。

  • 如果有双字节 Unicode 字节次序标志,则它假设编码是 UTF-16。它既可处理大 end ,也可处理小 endian。

  • 如果有四字节 Unicode 字节次序标志 (0xFF 0xFE 0xFF 0xFE),则它假设编码是 UTF-32。它既可处理大 endian,也可处理小 endian。

  • 否则,它假设编码是 UTF-8,除非它用指定其他一些字符集的编码属性(如 ISO-8859-1、Windows-1252、Shift-JIS 等),找到 XML 声明。

  您将看到两个从 XML DOM 返回的指出编码问题的出错消息。第一个通常指出文档中的字符与 XML 文档的编码不匹配:

  在文本内容中发现了一个无效字符。

ParseError 对象可告诉您这个捣乱字符在某一行的确切位置,以便使您解决该问题。

  第二个出错消息指出您一开始用的是 Unicode 字节次序标志(或调用了 LoadXML 方法),然后编码属性指定了不是双字节编码的编码(如 UTF-8 或 Windows-1250):

不支持从当前编码转换到指定的编码。

  另外,您可能调用了 Load 方法,并在一开始使用了单字节编码(没有字节次序标志),但是它随后发现了指定双字节或四字节编码(如 UTF-16 或 UCS-4)的编码属性。

  基本原则是不能利用 XML 声明的编码属性,在多字节字符集如 UTF-8、Shift-JIS 或 Windows-1250,与 Unicode 字符编码如 UTF-16、UCS-2 或 UCS-4 之间进行转换,这是因为声明本身必须对每个字符都使用与文档其余部分相同数量的字节。

  最后,IXMLHttpRequest 接口提供如下方法,用以访问下载的数据:

Methods Description
ResponseXML 表示由 MSXML DOM 分析器分析的响应实体(用与 Load 方法相同的规则)。
ResponseText 表示作为字串的响应实体。本方法盲目地解码从 UTF-8 收到的消息实体。这是一个已知问题,应在即将面市的 MSXML Web Release 中得到解决。
ResponseBody 表示作为无符号字节数组的响应实体。
ResponseStream 表示作为 IStream 接口的响应实体。

用 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 编码文件的结果是:

$#@60;test$#@62;Ã¥$#@60;/test$#@62;

 注意 上述例子只有当在浏览器以外的环境运行时,才有效。由于受到安全限制,在浏览器里调用 Save 方法将不会产生相同的结果。

尽管这看上去有点怪,但却是正确的。下列测试装载了用 UTF-8 编码的文件,并测试 UTF-8 是否被重新解码为 Unicode 字符值 229。它是:

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);

调用 save 方法时,您就会得到以下用 ISO-8859-1 编码的文件:

$#@60;?xml version="1.0" encoding="ISO-8859-1"?$#@62;
$#@60;test$#@62;ålt;/test$#@62;

  现在,小心不要被 XML 属性迷惑。XML 属性返回 Unicode 字串。如果在创建 ISO-8859-1 编码声明之后,调用 DOMDocument 对象上的 XML 属性,即可取回以下 Unicode 字串:

$#@60;?xml version="1.0"?$#@62;
$#@60;test$#@62;ålt;/test$#@62;

  请注意这里没有 ISO-8859-1 编码声明了。这是正常的。这样做的原因是使您可以转而用此字串调用 LoadXML,它会起作用。如果它不这么做,LoadXML 会失败并返回出错消息:“不支持从当前编码切换到指定的编码。”

结论

  但愿本文有助于解释字符编码的工作原理,特别是在 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 联机库:与混合环境的兼容性问题)

关注此文的读者还看过:

返回软件频道首页

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

热门
推荐

网友关注

软件
资料
游戏

文章排行

本周
本月
最新更新
天极服务| 关于我们| About us| 网站律师| 电子杂志| RSS订阅| 友情合作| 加入我们| 网站地图| MSN/QQ上看天极
TMG
Copyright (C) 1999-2009 Yesky.com, All Rights Reserved
版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868 在线提交意见反馈
渝ICP证B2-20030003号  通用网址:天极网
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众
经营性网站备案信息 网警备案 中国网站排名