📄 xml数据的编码方式.htm
字号:
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>时,可能收到的出错消息的类型。加载 XML DOM 文档的两个主要方法是
<B>LoadXML</B> 方法和 <B>Load</B> 方法。</P>
<P><B>LoadXML</B> 方法总是采用只在 UCS-2 或 UTF-16 中编码的 Unicode BSTR。如果将非有效的
Unicode BSTR 的内容传递给 <B>LoadXML,</B>则加载会失败。</P>
<P><B>Load</B> 方法可将以下内容当作 VARIANT:</P>
<TABLE class=clsRef cellSpacing=2 cellPadding=5 width="80%"
border=0>
<TBODY>
<TR vAlign=top>
<TD width="30%" bgColor=#a6caf0><B><FONT class=90v><FONT
size=2>Value</FONT></B></FONT></TD>
<TD width="70%" bgColor=#a6caf0><B><FONT class=90v><FONT
size=2>Description</FONT></B></FONT></TD></TR>
<TR vAlign=top>
<TD width="30%" bgColor=#eeeee>URL</TD>
<TD width="70%" bgColor=#eeeee><FONT class=90v size=2>如果
VARIANT 是 BSTR,则将其理解为 URL。</FONT></TD></TR>
<TR vAlign=top>
<TD width="30%" bgColor=#eeeee>VT_ARRAY | VT_UI1</TD>
<TD width="70%" bgColor=#eeeee><FONT class=90v size=2>VARIANT
也可以是包含原始编码字节的 SAFEARRAY。</FONT></TD></TR>
<TR vAlign=top>
<TD width="30%" bgColor=#eeeee><B><FONT class=90v><FONT
size=2>IUnknown</FONT></B></FONT></TD>
<TD width="70%" bgColor=#eeeee><FONT class=90v><FONT size=2>如果
VARIANT 是 <B><FONT class=90v>IUnknown </B>接口,则 DOM 文档为
<B><FONT class=90v>IStream</B>、<B><FONT
class=90v>IPersistStream</B> 和 <B><FONT
class=90v>IPersistStreamInit</B> 调用 <B><FONT
class=90v>QueryInterface</B>。</FONT></FONT></FONT></FONT></FONT></FONT></FONT></TD></TR></TBODY></TABLE><BR>
<P><B>Load</B> 方法实现以下算法,用于确定 XML 的<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>编码或<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>集。
<UL type=disc>
<LI>如果 Content-Type HTTP 标题定义了<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>集,该<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>集则替代 XML 文档本身的所有内容。因为没有 HTTP 标题,所以这显然不适用于
SAFEARRAY 和 <B>IStream</B> 机制。<BR><BR>
<LI>如果有双字节 Unicode 字节次序标志,则它假设编码是 UTF-16。它既可处理大 endian,也可处理小
endian。<BR><BR>
<LI>如果有四字节 Unicode 字节次序标志 (0xFF 0xFE 0xFF 0xFE),则它假设编码是
UTF-32。它既可处理大 endian,也可处理小 endian。<BR><BR>
<LI>否则,它假设编码是 UTF-8,除非它用指定其他一些<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>集的编码属性(如 ISO-8859-1、Windows-1252、Shift-JIS
等),找到 XML 声明。 </LI></UL>
<P>您将看到两个从 XML DOM 返回的指出编码问题的出错消息。第一个通常指出文档中的<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>与 XML 文档的编码不匹配:</P><PRE class=clsCode>在文本内容中发现了一个无效<A href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html" target=_blank>字符</A>。
</PRE>
<P><B>ParseError</B> 对象可告诉您这个捣乱<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>在某一行的确切位置,以便使您解决该问题。</P>
<P>第二个出错消息指出您一开始用的是 Unicode 字节次序标志(或调用了 <B>LoadXML</B>
方法),然后编码属性指定了不是双字节编码的编码(如 UTF-8 或 Windows-1250): </P><PRE class=clsCode>不支持从当前编码转换到指定的编码。
</PRE>
<P>另外,您可能调用了 <B>Load
</B>方法,并在一开始使用了单字节编码(没有字节次序标志),但是它随后发现了指定双字节或四字节编码(如 UTF-16 或
UCS-4)的编码属性。 </P>
<P>基本原则是不能利用 XML 声明的编码属性,在多字节<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>集如 UTF-8、Shift-JIS 或 Windows-1250,与 Unicode <A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>编码如 UTF-16、UCS-2 或 UCS-4 之间进行转换,这是因为声明本身必须对每个<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>都使用与文档其余部分相同数量的字节。</P>
<P>最后,<B>IXMLHttpRequest</B> 接口提供如下方法,用以访问下载的数据:</P>
<TABLE class=clsRef cellSpacing=2 cellPadding=5 width="75%"
border=0>
<TBODY>
<TR vAlign=top>
<TD width="33%" bgColor=#a6caf0><B><FONT class=90v><FONT
size=2>Methods</FONT></B></FONT></TD>
<TD width="67%" bgColor=#a6caf0><B><FONT class=90v><FONT
size=2>Description</FONT></B></FONT></TD></TR>
<TR vAlign=top>
<TD width="33%" bgColor=#eeeee><B><FONT class=90v><FONT
size=2>ResponseXML</FONT></B></FONT></TD>
<TD width="67%" bgColor=#eeeee><FONT class=90v><FONT
size=2>表示由 MSXML DOM 分析器分析的响应实体(用与 <B><FONT class=90v>Load
</B>方法相同的规则)。</FONT></FONT></FONT></TD></TR>
<TR vAlign=top>
<TD width="33%" bgColor=#eeeee><B><FONT class=90v><FONT
size=2>ResponseText</FONT></B></FONT></TD>
<TD width="67%" bgColor=#eeeee><FONT class=90v><FONT class=90v
size=2>表示作为字串的响应实体。本方法盲目地解码从 UTF-8 收到的消息实体。这是一个已知问题,应在即将面市的
MSXML Web Release 中得到解决。</FONT></FONT></TD></TR>
<TR vAlign=top>
<TD width="33%" bgColor=#eeeee><B><FONT class=90v><FONT
size=2>ResponseBody</FONT></B></FONT></TD>
<TD width="67%" bgColor=#eeeee><FONT class=90v
size=2>表示作为无符号字节数组的响应实体。</FONT></TD></TR><FONT class=90v>
<TR vAlign=top>
<TD width="33%" bgColor=#eeeee><B><FONT class=90v><FONT
size=2>ResponseStream</FONT></B></FONT></TD>
<TD width="67%" bgColor=#eeeee><FONT class=90v><FONT
size=2>表示作为 <B><FONT class=90v>IStream</B>
接口的响应实体。</FONT></FONT></FONT></TD></TR></TBODY></TABLE><BR>
<H2><A name=2>用 MSXML 创建新的 XML 文档</H2></A>
<P>一旦加载了 XML 文档,即可用 DOM 处理 XML 文档,而不必考虑任何编码问题,因为文档是作为 Unicode
存储在内存中的。所有 XML DOM 接口都是基于 COM BSTR 的,后者是双字节的 Unicode
字串。这就是说,您可以从新开始在包含所有 Unicode <A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>的内存中建立 MSXML DOM 文档,并且所有组建将会共享该内存中的 DOM,而不会对
Unicode <A href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>值的意思有任何疑惑。然而,当对其进行保存时,MSXML 将以默认方式按 UTF-8
编码所有数据。例如,假设您进行了以下处理:</P><PRE class=clsCode>var xmldoc = new ActiveXObject("Microsoft.XMLDOM")
var e = xmldoc.createElement("test");
e.text = "å;
xmldoc.appendChild(e);
xmldoc.save("foo.xml");
</PRE>
<P>下列 UTF-8 编码<A
href="http://jizhuwo.com/Soft/Tools/File/index.html"
target=_blank>文件</A>的结果是:</P><PRE class=clsCode><test>Ã¥</test>
</PRE>
<P class=indent><B><B>注意</B></B>
上述例子只有当在浏览器以外的环境运行时,才有效。由于受到安全限制,在浏览器里调用 <B>Save</B>
方法将不会产生相同的结果。</P>
<P>尽管这看上去有点怪,但却是正确的。下列测试装载了用 UTF-8 编码的<A
href="http://jizhuwo.com/Soft/Tools/File/index.html"
target=_blank>文件</A>,并测试 UTF-8 是否被重新解码为 Unicode <A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>值 229。它是:</P><PRE class=clsCode>var xmldoc = new ActiveXObject("Microsoft.XMLDOM")
xmldoc.load("foo.xml");
if (xmldoc.documentElement.text.charCodeAt(0) == 229)
{
WScript.echo("Yippee - it worked !!");
}
</PRE>
<P>要想更改 XML DOM <B>Save</B> 方法使用的编码,需要用如下位于文档顶部的编码属性创建 XML 声明:</P><PRE class=clsCode>var pi = xmldoc.createProcessingInstruction("xml",
" version='1.0' encoding='ISO-8859-1'");
xmldoc.appendChild(pi);
</PRE>
<P>调用 <B>save</B> 方法时,您就会得到以下用 ISO-8859-1 编码的<A
href="http://jizhuwo.com/Soft/Tools/File/index.html"
target=_blank>文件</A>:</P><PRE class=clsCode><?xml version="1.0" encoding="ISO-8859-1"?>
<test>ålt;/test>
</PRE>
<P>现在,小心不要被 <B>XML </B>属性迷惑。<B>XML</B> 属性返回 Unicode 字串。如果在创建
ISO-8859-1 编码声明之后,调用 <B>DOMDocument</B> 对象上的 <B>XML</B> 属性,即可取回以下
Unicode 字串:</P><PRE class=clsCode><?xml version="1.0"?>
<test>ålt;/test>
</PRE>
<P>请注意这里没有 ISO-8859-1 编码声明了。这是正常的。这样做的原因是使您可以转而用此字串调用
<B>LoadXML</B>,它会起作用。如果它不这么做,<B>LoadXML</B>
会失败并返回出错消息:“不支持从当前编码切换到指定的编码。”</P>
<H2><A name=3>结论</H2></A>
<P>但愿本文有助于解释<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>编码的工作原理,特别是在 XML 和 MSXML DOM 中的工作原理。一旦您理解了<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>集编码,它是相当简单的,而且 XML 是非常出色的,因为它在这方面未留有丝毫含糊的余地。尽管
MSXML DOM 有几处怪异需要密切留意,但它仍不失为一个能让您读取和写入任何 XML 编码的强大工具。</P>
<H2><A name=4>有关详细信息</H2></A>
<UL type=disc>
<LI>Microsoft MSDN Online Library: XML DOM Reference(Microsoft
MSDN 联机库:XML DOM 引用)<BR><BR>
<LI>Character Encoding Model(<A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>编码模型),作者:Ken Whistler 和 Mark Davis<BR><BR>
<LI>IANA Character Sets(IANA <A
href="http://jizhuwo.com/Dev/Programme/VC/Str/index.html"
target=_blank>字符</A>集)<BR><BR>
<LI><A href="http://www.ietf.org/">http://www.ietf.org/</A>(英文)的
Internet Engineering Task Force (IETF) 提供了 RFC 列表<BR><BR>
<LI>Microsoft MSDN Online Library: Compatibility Issues with Mixed
Environments(Microsoft MSDN 联机库:与混合环境的兼容性问题) </LI></UL>
<DIV></DIV><BR><BR>
<P></P><!-- content end -->
<DIV align=left>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="50%"><A
href="http://www.microsoft.com/china/msdn/library/techart/xmlencodings.<a%20href="
target=_blank index.html? Asp Web Dev jizhuwo.com
http:>asp</A>#top"></A></TD>
<TD width="50%">
<P align=right><A
href="http://www.microsoft.com/china/msdn/library/techart/xmlencodings.<a%20href="
target=_blank index.html? Asp Web Dev jizhuwo.com
http:>asp</A>#top"></A> </P></TD></TR>
<TR>
<TD width="100%" colSpan=2></TD></TR></TBODY></TABLE></DIV><BR><FONT
size=2><SPAN class=90V><SPAN
class=90v><BR></SPAN></FONT></SPAN></FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD bgColor=#d6d6d6 height=1></TD></TR>
<TR></TR>
<TR>
<TD align=middle colSpan=9></TD></TR></TBODY></TABLE>
<TABLE class=border3 cellSpacing=0 cellPadding=0 width=760 align=center
bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD colSpan=3 height=2></TD></TR></TBODY></TABLE>
<SCRIPT src=""></SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -