2012-12-05 9 views
6

Sto tentando di visualizzare un feed di dati su una pagina. Stiamo vivendo problemi di codifica con un personaggio strano. Per qualche motivo, nel feed c'è il carattere U+FFFD. E htmlentities() non sfuggirà al personaggio, quindi ho bisogno di sostituirlo manualmente. (Sto usando PHP 5.3)PHP: Come codificare U + FFFD per fare una sostituzione?

ho provato la seguente:

$string = str_replace("\xFFFD", "_", $string); 
$string = str_replace("\XFFFD", "_", $string); 
$string = str_replace("\uFFFD", "_", $string); 
$string = str_replace("\x{FFFD}", "_", $string); 
$string = str_replace("\X{FFFD}", "_", $string); 
$string = str_replace("\P{FFFD}", "_", $string); 
$string = str_replace("\p{FFFD}", "_", $string); 

Nessuno del lavoro di cui sopra.

Dopo aver letto questa pagina - http://php.net/manual/en/regexp.reference.unicode.php - Non sono sicuro di cosa sto facendo male. Devo compilare il supporto UTF-8 in PCRE?

+1

[Questo può aiutare] (http://stackoverflow.com/questions/4766778/how-to-encode-ufffd-in-order-to-do-a-replace?rq=1) linguaggio diverso ma molto simile risultato – Dale

+1

Prova anche a utilizzare la funzione [preg_replace] (http://php.net/preg_replace) in quanto str_replace non usa regex – Dale

+0

@redolent, Guys, interrompe [abusando del carattere 'U + FFFD'] (http: // stackoverflow.com/questions/4766778/how-to-encode-ufffd-in-order-to-do-a-replace#comment44707644_4766778) per quello che ** non è destinato a essere **. – Pacerier

risposta

6

Usa preg_replace invece in questo modo:

$string = preg_replace('@\x{FFFD}@u', '_', $string); 
9

Si dovrebbe tentare di risolvere il problema originale, FFFD (Il unicode replacement character) non è nella maggior parte dei casi, destinate ad essere un carattere di testo vero e proprio, ma un segno che qualcosa ha tentato da decodificare in una codifica UTF ma che qualcosa non è stato effettivamente codificato in una codifica UTF. È un'alternativa per ignorare in silenzio i byte non validi o interrompere completamente il processo di decodifica, in entrambi i casi, se lo vedi, si è verificato un errore.

Non c'è modo di sapere quale fosse il personaggio originale. Soprattutto con la tua soluzione, dal momento che sostituisci il personaggio con _, non puoi nemmeno sapere che la fonte originale è stata decodificata in modo errato. Dovresti tornare alla fonte e decodificarla correttamente.

Nota: È possibile che un testo di origine utilizzi come un carattere letterale, normale, ad esempio quando si parla di esso e non vi è quindi alcun errore. Sto escludendo questa possibilità nella mia risposta.

+0

Bene, " " * è * un carattere "reale" in sé ... :) Ma sì, sono d'accordo sul fatto che ci sia un problema di root che l'OP sta ignorando. +1 – deceze

+0

@deceze bene, piuttosto non è normale carattere di testo, ma sai cosa intendo giusto? – Esailija

+0

Beh, * è * un vero carattere di testo normale. Proprio come ☃ e 風 sono personaggi reali. È semplicemente usato in casi speciali. :) – deceze