Flanker (./3) :
GoldenCrystal (./2) :
A priori tu utilises un parser XML dans ton document, mais © n'est pas une entité XML, mais c'est bien une entité XHTML/HTML, Je pense que c'est ça l'erreur.
D'ailleurs tu n'appelles pas la fonction htmlentities dans ton code donc si je ne me trompe pas, c'est buggué.
Dans la version actuelle, © à la place de © devrait fonctionner (mais ton code resterai buggué), et si tu échappes bien les entités dans les attributs avec htmlentities($texte, ENT_QUOTES, 'UTF-8'), alors il te suffira d'utiliser l'encodage UTF-8 pour tout les caractères.
Je croyais que le XHTML était du XML pur ?
Et je ne comprends pas bien pourquoi je devrais échapper des caractères, en l'occurence ? Vu que les seuls < et > (par exemple) qui restent sont ceux qui ont une signification XML, non ?
Oui, XHTML est du XML pur, mais XML ne supporte que 5 entités: & < > " ' Ces entités sont indispensables pour que tu puisse insérer les caractères correspondant dans ton code XML, les autres entités sont définies dans le DTD (XHTML 1.0 Strict par exemple) que tu as associé au document.
Et à priori le parseur XML de PHP n'est pas très souple (en fait la documentation est tellement vaue que voilà) donc je ne sais pas du tout comment il gère les entités.
Après quand tu fais marcher le parseur, il va lui automatiquement remplacer < par <, > par > etc... Car c'est le comportement normal.
Donc si tu as <tag><</tag> il va te donner '<' que tu dois à nouveau échapper avec htmlentities

Et puisqu'à priori tu utilise du code UTF-8 pour le XML il faut bien le spécifier à PHP pour qu'il puisse bien faire son boulot (sauf erreur de ma part il n'est pas nativement utf-8) donc htmlentities($texte, ENT_QUOTES, 'UTF-8'), fonctionnera partout (attributs et texte des balises) même si tu peux être plus précis et changer le ENT_QUOTES selon où tu es dans le flux. (ça fera économiser quelques octets

)
Le code comme ça marchera peut-être, je ne sais pas trop ^^
if($xhtml5) { ob_start('ob_flush_transform'); }
function ob_flush_transform($buffer) {
global $xml_output;
$xml_output = '';
$xml_parser = xml_parser_create('UTF-8'); // Apparemment c'est par défaut UTF-8 sur certains PHP mais pas tous...
xml_set_element_handler($xml_parser, "transtype_begin", "transtype_end");
xml_set_character_data_handler($xml_parser, "transtype_content");
xml_set_default_handler($xml_parser, "transtype_default");
xml_parse($xml_parser, $buffer);
xml_parser_free($xml_parser);
return $xml_output;
}
function transtype_begin($parser, $name, $attr) {
global $xml_output;
$attrs = '';
foreach($attr as $key => $value) {
$key = strtolower($key);
$value = htmlentities($value, ENT_COMPAT, 'UTF-8');
$attrs .= " $key=\"$value\"";
}
$xml_output .= "<$name$attrs>\n";
}
function transtype_end($parser, $name) {
global $xml_output;
$name = strtolower($name);
$xml_output .= "</$name>\n";
}
function transtype_content($parser, $content) {
global $xml_output;
$xml_output .= htmlentities($content, ENT_NOQUOTES, 'UTF-8');
}
function transtype_default($parser, $content) {
global $xml_output;
$xml_output .= htmlentities($content, ENT_NOQUOTES, 'UTF-8');
}
Sinon de ce que j'avais testé, IE ne digère pas le application/xml+xhtml. Et d'autre part comme tu spécifie un document XML pur, de mémoire firefox acceptait l'utilisation de innerHTML que si le code inséré était du XML valide, mais je ne sais pas les détails pour du xhtml+xml ^^
De toutes façons la façon recommendée est d'utiliser le DOM pour insérer les éléments (par contre à chaque fois que j'ai fait ça j'ai constaté que les nouveaux éléments n'héritaient pas du style défini dans la page donc... je sais pas trop ^^)