Va bene - credo di aver ottenuto una maniglia su questo ora - voglio approfondire alcuni degli errori di codifica che le persone sono sempre a:
Questo sembra essere un caso avanzato di mojibake, ma qui è quello che penso stia succedendo. Il sospetto originario di MikeAinOz che si tratti di dati UTF-8 è probabilmente vero. Se prendiamo i seguenti dati UTF-8:
4 minutes
Ora, rimuovere l'entità HTML, e sostituirlo con il carattere che in realtà corrisponde a: U + 00A0. (E 'uno spazio non-breaking, quindi non posso esattamente "show" si Si ottiene la stringa:.. "4 minuti" codificare questo come UTF-8, e si ottiene la seguente sequenza di byte:
characters: 4 [nbsp] m i n ...
bytes : 34 C2 A0 6D 69 6E ...
(Sto usando [nbsp] sopra per indicare uno spazio letterale senza interruzioni (il carattere, non l'entità HTML
, ma il carattere che rappresenta. È solo uno spazio bianco, e quindi, difficile). [nbsp]/U + 00A0 (spazio di interruzione) richiede 2 byte per codificare in UTF-8
Ora, per passare dal flusso di byte al testo leggibile, dovremmo decodificare utilizzando UTF-8, poiché è ciò che abbiamo codificato. Usiamo ISO-8859-1 ("latin1") - se usi quello sbagliato, questo è quasi un lo fa sempre
bytes : 34 C2 A0 6D 69 6E ...
characters: 4 Â [nbsp] m i n ...
E commuta lo spazio grezzo non interrotto nella sua rappresentazione di entità HTML e ottieni quello che hai.
Quindi, il tuo materiale PHP sta interpretando il tuo testo nel set di caratteri sbagliato, e devi dirlo altrimenti, o stai trasmettendo il risultato in qualche modo nel set di caratteri sbagliato. Più codice sarebbe utile qui - dove stai ottenendo i dati che stai passando a questo loadHTML, e come stai andando a ottenere l'output che stai vedendo?
Alcuni di fondo: A "codifica dei caratteri" è solo un mezzo di passare da una serie di personaggi, per una serie di byte. Quali byte rappresentano "é"?UTF-8 dice C3 A9
, mentre ISO-8859-1 dice E9
. Per recuperare il testo originale da una serie di byte, dobbiamo sapere con cosa lo abbiamo codificato. Se decodifichiamo C3 A9
come dati UTF-8, otteniamo "é" indietro, se (per errore) lo decodifichiamo come ISO-8859-1, otteniamo "Ã ©". Junk. In pseudo-codice:
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
Questo non è il codice PHP, e non è il fix ... è solo il punto cruciale del problema. Da qualche parte, su larga scala, sta accadendo e le cose sono confuse.
La domanda è come li hai ottenuti in primo luogo ... – Artefacto
Stavo usando DOM per caricare una pagina HTML e dopo averla analizzata e mostrata, era proprio lì. Non ho idea di come sia arrivato. Edit: Beh, in realtà il ' ' era già nella fonte originale, ma non la A. – Strawberry
Qual è la codifica di questa pagina HTML e come la stai caricando? – Artefacto