2010-08-30 13 views
8

Ogni linea è una stringaPerché non riesco a liberarmi di questo  ?

 4 
 minutes 
 12 
 minutes 
 16 
 minutes 

ero in grado di rimuovere il  con successo utilizzando str_replace ma non l'entità HTML. Ho trovato questa domanda: How to remove html special chars?

Ma la preg_replace non ha funzionato. Come posso rimuovere l'entità HTML e quella A?

Edit: Penso che avrei dovuto dire questo prima: sto usando DOMDocument::loadHTML() e DOMXpath. Modifica: Dato che questo sembra un problema di codifica, dovrei dire che questo è in realtà tutte le stringhe separate.

+7

La domanda è come li hai ottenuti in primo luogo ... – Artefacto

+0

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

+1

Qual è la codifica di questa pagina HTML e come la stai caricando? – Artefacto

risposta

18

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.

+0

Fantastica spiegazione. Ho esaurito i voti positivi :( –

+0

Questa è una grande risposta, grazie! Spero che più persone possano prevederlo. – Strawberry

0

Questo sembra un errore di codifica: il documento è codificato con UTF-8, ma viene visualizzato come ASCII. Risolvendo il tuo errore di codifica risolverà i tuoi problemi. Si potrebbe provare a utilizzare utf8_decode() della sorgente prima di utilizzare DOMdocument::loadHTML()

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

+0

Haha, in realtà ho appena visto quel commento e lo sto testando al momento. – Strawberry

+0

Non sembra funzionare per me. – Strawberry

Problemi correlati