Afin d'avoir un valide XML final du texte, vous devez échapper à toutes les entités XML et le texte écrit dans le même encodage que le document XML processing-instruction unis (le "codage" dans l' <?xml
ligne). Les caractères accentués n'avez pas besoin d'être échappé aussi longtemps qu'ils sont codés comme le document.
Cependant, dans de nombreuses situations tout simplement échapper à la saisie avec htmlspecialchars
peut entraîner une double codé entités (par exemple, é
deviendrait &eacute;
), alors je vous suggère de décodage des entités html en premier:
function xml_escape($s)
{
$s = html_entity_decode($s, ENT_QUOTES, 'UTF-8');
$s = htmlspecialchars($s, ENT_QUOTES, 'UTF-8', false);
return $s;
}
Maintenant, vous devez vous assurer que tous les caractères accentués sont valables dans le codage du document XML. Je vous encourage fortement à toujours coder sortie XML en UTF-8, car pas tous les parseurs XML respecter le document XML processing-instruction de codage. Si votre entrée peut venir d'un jeu de caractères différent, essayez d'utiliser utf8_encode()
.
Il y a un cas spécial, qui est votre entrée peut provenir de l'une de ces codages: ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, et KOI8-R -- PHP traite tous de la même manière, mais il y a quelques légères différences entre eux-dont certains même iconv()
ne peut pas gérer. Je ne pouvais résoudre ce problème de codage en complétant utf8_encode()
comportement:
function encode_utf8($s)
{
$cp1252_map = array(
"\xc2\x80" => "\xe2\x82\xac",
"\xc2\x82" => "\xe2\x80\x9a",
"\xc2\x83" => "\xc6\x92",
"\xc2\x84" => "\xe2\x80\x9e",
"\xc2\x85" => "\xe2\x80\xa6",
"\xc2\x86" => "\xe2\x80\xa0",
"\xc2\x87" => "\xe2\x80\xa1",
"\xc2\x88" => "\xcb\x86",
"\xc2\x89" => "\xe2\x80\xb0",
"\xc2\x8a" => "\xc5\xa0",
"\xc2\x8b" => "\xe2\x80\xb9",
"\xc2\x8c" => "\xc5\x92",
"\xc2\x8e" => "\xc5\xbd",
"\xc2\x91" => "\xe2\x80\x98",
"\xc2\x92" => "\xe2\x80\x99",
"\xc2\x93" => "\xe2\x80\x9c",
"\xc2\x94" => "\xe2\x80\x9d",
"\xc2\x95" => "\xe2\x80\xa2",
"\xc2\x96" => "\xe2\x80\x93",
"\xc2\x97" => "\xe2\x80\x94",
"\xc2\x98" => "\xcb\x9c",
"\xc2\x99" => "\xe2\x84\xa2",
"\xc2\x9a" => "\xc5\xa1",
"\xc2\x9b" => "\xe2\x80\xba",
"\xc2\x9c" => "\xc5\x93",
"\xc2\x9e" => "\xc5\xbe",
"\xc2\x9f" => "\xc5\xb8"
);
$s=strtr(utf8_encode($s), $cp1252_map);
return $s;
}