2010-08-30 11 views
8

Cada línea es una cadena¿Por qué no puedo deshacerme de esto?  ?

 4 
 minutes 
 12 
 minutes 
 16 
 minutes 

yo era capaz de quitar el  con éxito utilizando str_replace pero no la entidad HTML. Encontré esta pregunta: How to remove html special chars?

Pero el preg_replace no hizo el trabajo. ¿Cómo puedo eliminar la entidad HTML y ese A?

Editar: creo que debería haber dicho esto antes: Estoy utilizando DOMDocument::loadHTML() y DOMXpath. Editar: Dado que esto parece un problema de codificación, debería decir que esto es en realidad todas las cadenas por separado.

+7

La pregunta es cómo los obtuvo en primer lugar ... – Artefacto

+0

Estaba usando DOM para cargar una página HTML y después de analizarla y mostrarla, estaba allí. No tengo idea como llego ahi. Editar: Bueno, en realidad el ' ' ya estaba en la fuente original, pero no en el A. – Strawberry

+1

¿Cuál es la codificación de esta página HTML y cómo la está cargando? – Artefacto

Respuesta

18

Alright - Creo que tengo una manija en esto ahora - Quiero ampliar en algunos de los errores de codificación que la gente se está en:

Esto parece ser un caso avanzado de mojibake, pero aquí es lo que creo que está pasando. La sospecha original de MikeAinOz de que se trata de datos de UTF-8 es probablemente cierta. Si tomamos los siguientes datos UTF-8:

4 minutes

Ahora, retire la entidad HTML, y reemplazarlo con el personaje que en realidad se corresponde con: U + 00A0. (Es un espacio de no separación, por lo que puede no exactamente "espectáculo" que usted obtener la cadena:.. "4   minutos" codificar esto como UTF-8, y se obtiene la siguiente secuencia de bytes:

characters: 4 [nbsp] m i n ... 
bytes  : 34 C2 A0 6D 69 6E ... 

(Estoy usando [nbsp] arriba para referirme a un espacio literal sin interrupción (el carácter, no la entidad HTML  , pero el carácter que representa. Es solo espacio en blanco, y por lo tanto, es difícil.) Tenga en cuenta que [nbsp]/U + 00A0 (espacio sin interrupción) toma 2 bytes para codificar en UTF-8.

Ahora, para pasar de la secuencia de bytes a texto legible, debemos decodificar usando UTF-8, ya que eso es codificamos en. Permítanos usar ISO-8859-1 ("latin1") - si usa el incorrecto, esto es casi una lo hace.

bytes  : 34 C2  A0 6D 69 6E ... 
characters: 4 Â [nbsp] m i n ... 

Y cambie el espacio de no separación sin procesar en su representación de entidad HTML, y obtendrá lo que tiene.

Por lo tanto, cualquiera de sus cosas PHP está interpretando su texto en el juego de caracteres incorrecto, y necesita decirlo de otra manera, o está produciendo el resultado de alguna manera en el juego de caracteres incorrecto. Más código sería útil aquí: ¿dónde está obteniendo los datos que está transfiriendo a este loadHTML, y cómo va a obtener el resultado que está viendo?


Algunos antecedentes: Un "codificación de caracteres" es sólo un medio para pasar de una serie de personajes, a una serie de bytes. ¿Qué bytes representan "é"?UTF-8 dice C3 A9, mientras que ISO-8859-1 dice E9. Para recuperar el texto original de una serie de bytes, debemos saber con qué lo codificamos. Si decodificamos C3 A9 como datos UTF-8, obtenemos "é", si (erróneamente) lo decodificamos como ISO-8859-1, obtenemos "Ã ©". Basura. En pseudo-código:

utf8-decode (utf8-encode (text-data))   // OK 
iso8859_1-decode (iso8859_1-encode (text-data)) // OK 
iso8859_1-decode (utf8-encode (text-data))  // Fails 
utf8-decode (iso8859_1-encode (text-data))  // Fails 

Esto no es código PHP, y no es su solución ... es sólo la clave del problema. En algún lugar, a gran escala, eso está sucediendo, y las cosas se confunden.

+0

Explicación impresionante. Me quedé sin votos por votos :( –

+0

Esta es una gran respuesta. ¡Gracias! Espero que más personas puedan votar esto. – Strawberry

0

Parece un error de codificación: su documento está codificado con UTF-8, pero se representa como ASCII. Resolver el error de codificación resolverá sus problemas. Puede intentar usar utf8_decode() en su fuente antes de usar DOMdocument::loadHTML()

Here's an alternative solution from the DOMdocument::loadHTML() documentation page.

+0

Jaja, en realidad acabo de ver ese comentario y lo estoy probando en este momento. – Strawberry

+0

No pareció funcionar para mí. – Strawberry

Cuestiones relacionadas