Кодирование XML и методы интерфейса DOM
В этой статье описывается кодирование XML и методы интерфейса DOM.
Исходная версия продукта: Расширяемый язык разметки
Исходный номер базы знаний: 275883
Сводка
Одним из основных преимуществ данных XML является то, что они являются независимой платформой. Однако необходимо указать правильную кодировку, чтобы обеспечить правильную передачу XML-данных между разными платформами. В техническом документе How to Encode XML Data (Кодирование XML-данных) подробно рассматриваются общие проблемы с кодировкой XML: Кодирование XML-данных.
В большинстве сценариев ошибки кодирования XML возникают из различных параметров кодирования по умолчанию методов и интерфейсов средства синтаксического анализа XML (MSXML). Четкое понимание этих параметров по умолчанию поможет предотвратить ошибки кодирования.
Кодировки XML
MSXML поддерживает все кодировки, поддерживаемые интернет-Обозреватель. Поддержка интернет-Обозреватель зависит от того, какие языковые пакеты установлены на компьютере. Эти сведения хранятся в разделе реестра: 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 в зависимости от наличия метки порядка байтов ЮНИКОДа (BOM) в начале XML-файла. Если файл начинается с метки порядка байтов ЮНИКОДа (0xFF 0xFE) или (0xFE 0xFF), документ считается в кодировке UTF-16; В противном случае он находится в UTF-8. Метод IXMLDOMDocument
Save интерфейса поддерживает исходную кодировку документа. По умолчанию для этого метода используется UTF-8.
Ошибки модели DOM MSXML
Две распространенные ошибки, возвращаемые методами интерфейса модели DOM:
-
В текстовом содержимом найден недопустимый символ.
-
Переключение с текущей кодировки на указанную кодировку не поддерживается.
При использовании метода IXMLDOMDocument
загрузки интерфейса эти ошибки обычно возникают при следующих условиях:
Кодировка не указана, метка порядка байтов не найдена в начале XML-файла, а данные содержат специальные символы.
Указанная кодировка не соответствует фактической кодировке XML-данных. Рекомендуется всегда указывать правильную кодировку внутри xml-объявления, а не принимать кодировку по умолчанию.
При использовании средства синтаксического анализа MSXML версий 2.5, 2.5 с пакетом loadXML
обновления 1 (SP1) и 2.6 метод 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
интерфейса с XSL-файлом или XSLT, в котором указана информация о кодировке XML следующим образом:
<xsl:output method="xml" encoding="UTF-8" />
Метод transformNode
возвращает BSTR, который по определению является данными в кодировке UTF-16. Лучший способ сохранить кодировку — вызвать transformNodeToObject
метод и сохранить результаты в потоке или в новом XML-документе, а затем сохранить его.