Para tener un texto XML final válido, debe escapar de todas las entidades XML y tener el texto escrito en la misma codificación que el documento XML-instruction instructions (la "codificación" en la línea <?xml
). Los caracteres acentuados no necesitan escaparse mientras estén codificados como el documento.
Sin embargo, en muchas situaciones, simplemente escapar de la entrada con htmlspecialchars
puede conducir a doble codificado entidades (por ejemplo é
se convertiría en &eacute;
), por lo que sugiero entidades html decodificación primera:
function xml_escape($s)
{
$s = html_entity_decode($s, ENT_QUOTES, 'UTF-8');
$s = htmlspecialchars($s, ENT_QUOTES, 'UTF-8', false);
return $s;
}
A continuación, debe asegúrese de que todos los caracteres acentuados sean válidos en la codificación del documento XML. Recomiendo encarecidamente codificar siempre la salida XML en UTF-8, ya que no todos los analizadores XML respetan la codificación de instrucciones de procesamiento de documentos XML. Si su entrada puede provenir de un juego de caracteres diferente, intente con utf8_encode()
.
Hay un caso especial, que es su entrada puede venir de una de estas codificaciones: ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252 y KOI8-R - PHP los trata de todos modos, pero hay algunas pequeñas diferencias en ellos, algunos de los cuales incluso iconv()
no pueden manejar. Sólo podía resolver este problema codificación complementando utf8_encode()
comportamiento:
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;
}
@Tchalvak: Usted está equivocado con muchos de los puntos criticas en su descripción de recompensas. Traté de hacer esto visible con las respuestas existentes, espero que esto sea útil. – hakre
No sugerí en mi respuesta usar la API DOM solo para el escape de cadenas. Le sugerí que genere su documento XML completo usando esa API. Esto es en respuesta a los problemas que mencionas en la descripción de tu recompensa. –