本文介绍 XML 编码和 DOM 接口方法。
原始产品版本: 可扩展标记语言
原始 KB 数: 275883
总结
可扩展标记语言(XML)数据的一个主要优点是它是一个独立的平台。 但是,必须指定正确的编码,以确保在不同平台之间正确传输 XML 数据。 白皮书 如何对 XML 数据 进行编码,详细介绍了一般 XML 编码问题: 如何对 XML 数据进行编码。
在大多数情况下,XML 编码错误源自 XML 分析程序(MSXML)方法和接口的不同默认编码设置。 清楚地了解这些默认设置将有助于防止编码错误。
XML 编码
MSXML 支持 Internet Explorer 支持的所有编码。 Internet Explorer 的支持取决于计算机上安装的语言包;此信息存储在注册表项下: HKEY_CLASSES_ROOT\MIME\Database\Charset
MSXML 对以下编码具有本机支持:
UTF-8
UTF-16
UCS-2
UCS-4
ISO-10646-UCS-2
UNICODE-1-1-UTF-8
UNICODE-2-0-UTF-16
UNICODE-2-0-UTF-8
It also recognizes (internally using the WideCharToMultibyte API function for mappings) the following encodings:
US-ASCII
ISO-8859-1
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
WINDOWS-1250
WINDOWS-1251
WINDOWS-1252
WINDOWS-1253
WINDOWS-1254
WINDOWS-1255
WINDOWS-1256
WINDOWS-1257
WINDOWS-1258
为数据指定编码的正确位置是 XML 声明。 例如,如果数据使用 ISO-8859-1
标准编码,则可以按如下所示指定此数据:
<?xml version="1.0" encoding="ISO-8859-1"?>
如果没有此信息,默认编码为 UTF-8 或 UTF-16,具体取决于 XML 文件的开头是否存在 UNICODE 字节顺序标记(BOM)。 如果文件以 UNICODE 字节顺序标记(0xFF 0xFE)或(0xFE 0xFF)开头,则文档被视为采用 UTF-16 编码;否则,它位于 UTF-8 中。 接口的 IXMLDOMDocument
Save 方法维护文档的原始编码。 此方法的默认值为 UTF-8。
MSXML DOM 错误
XML 文档对象模型 (DOM) 接口方法返回的两个常见错误包括:
-
文本内容中找到了无效字符。
-
不支持从当前编码切换到指定的编码。
使用接口的 IXMLDOMDocument
加载方法时,这些错误通常发生在以下情况下:
未指定编码,在 XML 文件的开头找不到字节顺序标记,并且数据包含特殊字符
指定的编码与 XML 数据的实际编码不匹配。 最佳做法是始终在 XML 声明中指定正确的编码,而不是接受默认编码。
使用 MSXML 分析器版本 2.5、2.5 SP1 和 2.6,该方法loadXML
IXMLDOMDocument
只能加载 UTF-16 或 UCS-2 编码的数据。 任何尝试加载使用另一种编码格式编码的 XML 数据都会导致以下错误:
不支持从当前编码切换到指定的编码。 随着 MSXML 3.0(Msxml3.dll)的发布,将删除此限制,并且以下代码运行时不会出现错误:
hr = pXMLDoc->loadXML("<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag1>Abcdef</tag1>");
注意
接口的 IXMLDOMDocument
xml 属性将 XML 数据写出为 UTF-16 编码,但在开头没有字节顺序标记。 这可能会导致编码问题。
调用 transformNode
接口的 IXMLDOMNode
方法并使用 XML 编码信息如下指定的 XSL 或 XSLT 文件时,您可能会收到这些错误:
<xsl:output method="xml" encoding="UTF-8" />
根据定义,该transformNode
方法返回一个UTF-16编码的BSTR数据。 保留编码的更好方法是调用 transformNodeToObject
该方法并将结果存储到流或新的 XML 文档,然后保存。