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.
La pregunta es cómo los obtuvo en primer lugar ... – Artefacto
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
¿Cuál es la codificación de esta página HTML y cómo la está cargando? – Artefacto