Il faut une version >= 2.8.0 pour que libxml2 gère correctement la balise HTML5 :
<meta charset="utf-8">
2.8.0: May 23 2012
[…]
Add HTML parser support for HTML5 meta charset encoding declaration (Denis Pauk)
[…]
Rappel : quel que soit le jeu du document de départ (réel comme déclaré), libxml2 le convertit à la volée en UTF-8 donc on ne lit/obtient et ne doit écrire qu'en UTF-8. Ceci est valable pour l'ensemble des extensions de PHP reposant sur libxml2 (DOM, SimpleXML, XMLReader et XMLWriter).
Revenons spécifiquement à DOM, si on étudie la documentation de DOMDocument on peut y trouver plusieurs propriétés possédant encoding dans leur nom :
Quelles différences entre elles ? Elles sont toutes gérées par la même fonction de callback pour la lecture de leur valeur (getter). La seule différence c'est que seule encoding dispose d'un setter (= peut être modifiée). Si vous deviez en retenir une : encoding.
Mais à quoi elles servent-elles ? Elles ne définissent que le jeu dans lequel sera sérialisé le document lors de l'appel à une des méthodes save*, soit le jeu dans lequel sera votre fichier pour save ou celui de la chaîne renvoyée par saveXML. Elles n'ont aucun effet sur la manipulation même du document en mémoire qui est et sera toujours en UTF-8 (il serait difficile sinon à un chinois de modifier un document XML écrit par un anglais par exemple). Par défaut, la sérialisation du document sera en UTF-8 et la déclaration est omise à moins d'explicitement faire :
# Avec : # $doc = new DomDocument; $doc->encoding = 'UTF-8'; // ou $doc = new DomDocument('1.0', 'UTF-8');
L'attribut encoding ayant le même effet que le paramètre encoding du constructeur.
int xmlSwapChild(xmlNodePtr n1, xmlNodePtr n2) { xmlNodePtr parent, tmp; if (NULL == n1 || NULL == n2) { return 0; } if (n1 == n2) { return 1; } /*if (n1->type != ? && n2->type != n1->type) { return 1; }*/ if ((parent = n1->parent) != n2->parent) { return 0; } tmp = n1->next; n1->next = n2->next; n2->next = tmp; if (NULL != n1->next) { n1->next->prev = n1; } if (NULL != n2->next) { n2->next->prev = n2; } tmp = n1->prev; n1->prev = n2->prev; n2->prev = tmp; if (NULL != n1->prev) { n1->prev->next = n1; } if (NULL != n2->prev) { n2->prev->next = n2; } if (parent->children == n1) { parent->children = n2; } else if (parent->children == n2) { parent->children = n1; } if (parent->last == n1) { parent->last = n2; } else if (parent->last == n2) { parent->last = n1; } return 1; }