2008-11-21 13 views
8

Estoy escribiendo algunos feeds RSS en PHP y estoy luchando con problemas de codificación de caracteres. ¿Debo utf8_encode() antes o después de la codificación htmlentities()? Por ejemplo, tengo dos símbolos de unión y los caracteres chinos en un elemento de descripción, y no estoy seguro de cuál de ellos es adecuado:utf-8 y htmlentities en fuentes RSS

$output = utf8_encode(htmlentities($source)); or 
$output = htmlentities(utf8_encode($source)); 

Y por qué?

+0

¿Por qué no usa UTF-8 en primer lugar? – Gumbo

Respuesta

17

Es importante pasar el juego de caracteres a la función htmlentities, como el predeterminado es la norma ISO-8859-1:

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8')); 

debe aplicar htmlentities por primera vez como para permitir utf8_encode para codificar las entidades correctamente.

(EDIT: cambié de mi opinión anterior a que el orden no importaba en función de los comentarios. Este código está probado y funciona bien).

+0

¡El pedido sí importa! utf8_encode antes de htmlentities() cambiará la forma en que se comporta. Compare string urldecode ('% E2% 82% AC') con y sin aplicar utf8_encode() primero. – Kornel

+0

Tiene razón, sin embargo, parece que usar htmlentities primero es el método correcto (lo probó). Cambié mi publicación para reflejarlo. –

1

Quiere hacer $output = htmlentities(utf8_encode($source));. Esto se debe a que primero desea convertir sus caracteres internacionales en UTF8 adecuado y luego tener ampersands (y posiblemente algunos de los caracteres UTF-8 también) entregados a entidades HTML. Si primero hace las entidades, es posible que algunos de los caracteres internacionales no se manejen correctamente.

Si ninguno de los caracteres internacionales van a ser cambiado por utf8_encode, entonces no importa qué orden se los llama en.

5

No utilizar htmlentities()!

Simplemente use los caracteres UTF-8. Solo asegúrese de declarar la codificación de la fuente en los encabezados HTTP (Content-Type:application/xml;charset=UTF-8) o, en su defecto, en la fuente de información usando el <?xml version="1.0" encoding="UTF-8"?> en la primera línea.

1

Puede ser más fácil olvidar las htmlentities y usar una sección CDATA. Funciona para la sección del título, que no parece de apoyo codificado caracteres HTML en el visor de RSS de Firefox:

<title><![CDATA[News & Updates " > » ☂ ☺ ☹ ☃ Test!]]></title> 
12

Primero: La utf8_encode function convierte entre ISO 8859-1 a UTF-8. Por lo tanto, solo necesita esta función, si su codificación de entrada/juego de caracteres es ISO 8859-1. Pero, ¿por qué no usas UTF-8 en primer lugar?

Segundo: No necesita htmlentities. Solo necesita htmlspecialchars para reemplazar los caracteres especiales por referencias de caracteres. htmlentities reemplazaría los caracteres "demasiados" que se pueden codificar directamente utilizando UTF-8. Importante es que utiliza el estilo de cotización ENT_QUOTES para reemplazar las comillas simples también.

Así que mi propuesta:

// if your input encoding is ISO 8859-1 
htmlspecialchars(utf8_encode($string), ENT_QUOTES) 

// if your input encoding is UTF-8 
htmlspecialchars($string, ENT_QUOTES, 'UTF-8') 
+0

Esta solución me ayudó. Exactamente la sección sobre 'ENT_QUOTES'. Gracias – helvete

0

Después de mucho error juicio &, finalmente encontré una manera de visualizar correctamente una cadena desde un valor base de datos UTF-8 codificados, a través de un archivo XML, a una página html:

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>'; 

Espero que esto ayude a alguien.