Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano kodowanie XML i metody interfejsu DOM.
Oryginalna wersja produktu: Extensible Markup Language
Oryginalny numer KB: 275883
Podsumowanie
Jedną z głównych zalet danych XML (rozszerzalny język znaczników) jest to, że stanowią niezależną platformę. Należy jednak określić prawidłowe kodowanie w celu zapewnienia prawidłowego transferu danych XML między różnymi platformami. Oficjalny dokument Jak kodować dane XML rozwiązuje ogólne problemy z kodowaniem XML: Jak kodować dane XML.
W większości scenariuszy błędy kodowania XML pochodzą z różnych domyślnych ustawień kodowania metod i interfejsów analizatora XML (MSXML). Jasne zrozumienie tych ustawień domyślnych pomoże zapobiec błędom kodowania.
Kodowanie XML
Program MSXML obsługuje wszystkie kodowanie obsługiwane przez program Internet Explorer. Obsługa programu Internet Explorer zależy od tego, które pakiety językowe są instalowane na komputerze; te informacje są przechowywane w kluczu rejestru: HKEY_CLASSES_ROOT\MIME\Database\Charset.
Program MSXML ma natywną obsługę następujących kodowań:
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
Właściwym miejscem do określenia kodowania danych jest deklaracja XML. Na przykład jeśli dane są kodowane przy użyciu ISO-8859-1 standardu, możesz określić to w następujący sposób:
<?xml version="1.0" encoding="ISO-8859-1"?>
Bez tych informacji domyślne kodowanie to UTF-8 lub UTF-16, w zależności od obecności znaku bajtów UNICODE (BOM) na początku pliku XML. Jeśli plik rozpoczyna się od znacznika kolejności bajtów UNICODE (0xFF 0xFE) lub (0xFE 0xFF), dokument jest uznawany za kodowany UTF-16; w przeciwnym razie znajduje się on w formacie UTF-8. Metoda Save interfejsu IXMLDOMDocument zachowuje oryginalne kodowanie dokumentu. Wartość domyślna dla tej metody to UTF-8.
Błędy MODELU DOM MSXML
Istnieją dwa typowe błędy zwracane z metod interfejsu modelu DOM (XML Document Object Model):
-
W zawartości tekstowej znaleziono nieprawidłowy znak.
-
Przełącz się z bieżącego kodowania na określone kodowanie nieobsługiwane.
W przypadku metody ładowania interfejsu IXMLDOMDocument te błędy zwykle występują w następujących warunkach:
Nie określono kodowania, na początku pliku XML nie można odnaleźć żadnego znacznika kolejności bajtów, a dane zawierają znaki specjalne
Określone kodowanie nie jest zgodne z rzeczywistym kodowaniem danych XML. Dobrym rozwiązaniem jest zawsze określenie poprawnego kodowania wewnątrz deklaracji XML, a nie zaakceptowanie domyślnego kodowania.
W wersjach analizatora MSXML 2.5, 2.5 SP1 i 2.6, metoda loadXMLIXMLDOMDocument, może ładować, tylko, zakodowane dane UTF-16 lub UCS-2. Każda próba załadowania danych XML zakodowanych przy użyciu innego formatu kodowania powoduje następujący błąd:
Przełącz się z bieżącego kodowania na określone kodowanie nieobsługiwane. Wraz z wydaniem programu MSXML 3.0 (Msxml3.dll) to ograniczenie zostało usunięte, a następujący kod jest uruchamiany bez błędu:
hr = pXMLDoc->loadXML("<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag1>Abcdef</tag1>");
Uwaga
Właściwość XML interfejsu IXMLDOMDocument zapisuje dane XML jako zakodowane w formacie UTF-16, ale bez znaku kolejności bajtów na początku. Może to prowadzić do problemów z kodowaniem.
Te błędy mogą być również wyświetlane podczas wywoływania transformNode metody interfejsu IXMLDOMNode z plikiem XSL lub XSLT, w którym określono informacje o kodowaniu XML w następujący sposób:
<xsl:output method="xml" encoding="UTF-8" />
Metoda transformNode zwraca ciąg BSTR zakodowany jako UTF-16 zgodnie z definicją. Lepszym sposobem na zachowanie kodowania jest wywołanie metody transformNodeToObject i przechowanie wyników do strumienia lub jako nowy dokument XML, a następnie jego zapisanie.