Codifica XML e metodi di interfaccia DOM

Questo articolo descrive la codifica XML e i metodi dell'interfaccia DOM.

Versione originale del prodotto: Extensible Markup Language
Numero KB originale: 275883

Riepilogo

Uno dei principali vantaggi dei dati XML (Extensible Markup Language) è che si tratta di una piattaforma indipendente. È tuttavia necessario specificare la codifica corretta per garantire il corretto trasferimento dei dati XML tra piattaforme diverse. Il white paper How to Encode XML Data risolve in dettaglio i problemi generali di codifica XML: Come codificare i dati XML.

Nella maggior parte degli scenari, gli errori di codifica XML derivano dalle diverse impostazioni di codifica predefinite dei metodi e delle interfacce del parser XML (MSXML). Una chiara comprensione di queste impostazioni predefinite consentirà di evitare gli errori di codifica.

Codifiche XML

MSXML supporta tutte le codifiche supportate da Internet Explorer. Il supporto di Internet Explorer dipende dai Language Pack installati nel computer; queste informazioni vengono archiviate nella chiave del Registro di sistema: HKEY_CLASSES_ROOT\MIME\Database\Charset.

MSXML offre il supporto nativo per le codifiche seguenti:

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

La posizione appropriata per specificare la codifica per i dati è la dichiarazione XML. Ad esempio, se i dati sono codificati con ISO-8859-1 standard, è possibile specificarlo come indicato di seguito:

<?xml version="1.0" encoding="ISO-8859-1"?>

Senza queste informazioni, la codifica predefinita è UTF-8 o UTF-16, a seconda della presenza di un indicatore dell'ordine dei byte UNICODE all'inizio del file XML. Se il file inizia con un segno di ordine dei byte UNICODE (0xFF 0xFE) o (0xFE 0xFF), il documento viene considerato in codifica UTF-16; in caso contrario, è in UTF-8. Il metodo Save dell'interfaccia IXMLDOMDocument mantiene la codifica originale del documento. Il valore predefinito per questo metodo è UTF-8.

Errori DOM MSXML

Due errori comuni restituiti dai metodi di interfaccia DOM (Document Object Model) XML sono:

  • È stato trovato un carattere non valido nel contenuto di testo.

  • Passare dalla codifica corrente alla codifica specificata non supportata.

Con il metodo di caricamento dell'interfaccia IXMLDOMDocument , questi errori si verificano in genere nelle condizioni seguenti:

  • Non viene specificata alcuna codifica, non viene trovato alcun segno di ordine dei byte all'inizio del file XML e i dati contengono caratteri speciali

  • La codifica specificata non corrisponde alla codifica effettiva dei dati XML. È consigliabile specificare sempre la codifica corretta all'interno della dichiarazione XML, anziché accettare la codifica predefinita.

Con le versioni del parser MSXML 2.5, 2.5 SP1 e 2.6, il loadXML metodo di IXMLDOMDocument può caricare solo dati codificati UTF-16 o UCS-2. Qualsiasi tentativo di caricare dati XML codificati con un altro formato di codifica genera l'errore seguente:

Passare dalla codifica corrente alla codifica specificata non supportata. Con il rilascio di MSXML 3.0 (Msxml3.dll), questa restrizione viene rimossa e il codice seguente viene eseguito senza errori:

hr = pXMLDoc->loadXML("<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag1>Abcdef</tag1>");

Nota

La proprietà xml dell'interfaccia IXMLDOMDocument scrive i dati XML come codifica UTF-16, ma senza il segno di ordine dei byte all'inizio. Ciò può causare problemi di codifica.

È anche possibile ricevere questi errori quando si chiama il transformNode metodo dell'interfaccia IXMLDOMNode con un file XSL o XSLT in cui vengono specificate le informazioni di codifica XML come indicato di seguito:

<xsl:output method="xml" encoding="UTF-8" />

Il transformNode metodo restituisce un BSTR che è dati codificati UTF-16 per definizione. Un modo migliore per conservare la codifica consiste nel chiamare il transformNodeToObject metodo e archiviare i risultati in un flusso o in un nuovo documento XML e quindi salvarlo.

Riferimenti

Spazio dei nomiSystem.Xml