2009-09-28 16 views
13

Ho un modulo HTML e alcuni utenti stanno copiando/incollando testo da MS Word. Quando ci sono le virgolette singole o doppi apici, essi vengono tradotti in caratteri divertenti come:Perché le virgolette diventano caratteri buffi quando vengono inviate in un modulo HTML?

' €  ™ e à ¢ â €  ™

La colonna del database è collazione utf8_general_ci.

Come visualizzare i caratteri appropriati?

Modifica: Problema risolto. Ecco come l'ho risolto:

Ran mysql_query("SET NAMES 'utf8'"); prima di aggiungere/resettare dal database. (grazie al commento di Donal qui sotto).

E un po 'strano, la funzione di php urlencode($text) è stata applicata durante la visualizzazione, quindi è stato necessario rimuoverlo.

Mi sono anche assicurato che le intestazioni per la pagina e la richiesta/risposta ajax fossero tutte utf8.

+4

MS Word modifica le virgolette in "virgolette", che sono tutt'altro che intelligenti. Usano una "code page" Microsoft al posto di Unicode. –

+0

Lo noterete anche con alcuni trattini. – Buggabill

+1

Se tutte le codifiche sono state specificate correttamente, queste dovrebbero essere automaticamente convertite nel loro equivalente Unicode. Dubito che il problema sia specifico di Word; prova a digitare per es. Alt + 130 (é) direttamente, e vedere se si imbatte in modo pulito. – Thomas

risposta

21

Questo appare come un classico caso di Unicode (UTF-8 più probabile) caratteri di essere interpretati come iso-8859-1. Ci sono un paio di posti lungo la strada dove i personaggi possono essere corrotti. Innanzitutto, il browser del cliente deve inviare i dati. Potrebbe corrompere i dati se non è in grado di convertire correttamente i caratteri nella codifica dei caratteri della pagina. Quindi il server legge i dati e decodifica i byte in caratteri. Se il client e il server non sono d'accordo sulla codifica utilizzata, i caratteri saranno corrotti. Quindi i dati sono memorizzati nel database; di nuovo c'è il potenziale per la corruzione. Infine, quando i dati vengono scritti sulla pagina (per la visualizzazione sul browser), il browser potrebbe interpretare erroneamente i byte se la pagina non indica adeguatamente la codifica.

È necessario assicurarsi di utilizzare UTF-8 in tutto. L'impostazione predefinita per le pagine web è iso-8859-1, in modo che le pagine web dovrebbe essere servito con l'intestazione Content-Type o il meta tag

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

(assicuratevi che realmente sta servendo il testo che codifica).

Utilizzando UTF-8 in tutte le parti del processo, si evitano problemi con tutti i browser Web e i database funzionanti.

+1

+1, non esiste una soluzione locale per questi problemi, l'importante è la mentalità di essere sensibili alla codifica ovunque si trasmetta o si memorizzi del testo. –

+0

Sì, sono d'accordo con @ user8599 .... – omega

5

Verificare la codifica utilizzata dalla pagina. Codificare usando UTF-8 come pure, e aggiungere un meta tag che descrive la codifica:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
4

abbiamo una funzione PHP che cerca di ripulire il pasticcio con le virgolette. È un po 'un casino, dal momento che è cresciuto in maniera organica man mano che i casi sono spuntati durante lo sviluppo del prototipo. Può essere di qualche aiuto, però:

function convert_smart_quotes($string) { 
    $search = array(chr(0xe2) . chr(0x80) . chr(0x98), 
        chr(0xe2) . chr(0x80) . chr(0x99), 
        chr(0xe2) . chr(0x80) . chr(0x9c), 
        chr(0xe2) . chr(0x80) . chr(0x9d), 
        chr(0xe2) . chr(0x80) . chr(0x93), 
        chr(0xe2) . chr(0x80) . chr(0x94), 
        chr(226) . chr(128) . chr(153), 
        '’','“','â€<9d>','â€"',' '); 

    $replace = array("'","'",'"','"',' - ',' - ',"'","'",'"','"',' - ',' '); 

    return str_replace($search, $replace, $string); 
} 
+4

L'ho fatto anch'io, ma penso che sia una cattiva idea. Se hai un processo di testo o qualsiasi altro tipo di processo che corrompe i tuoi dati, correggi il processo in modo che non corrompa i dati, non apportare solo correzioni frammentarie all'output. –

+0

Sì - mezzo decennio più tardi. Mi sono imbattuto in questo mentre stavo mantenendo il codice esistente. Conoscevo i problemi di taglia/incolla di programmi come Word, ma per eseguire il backup di @ mike-a su di esso, a volte non è possibile controllare la fonte delle informazioni e devi adottare un approccio di normalizzazione al tuo flusso di dati. L'ho usato e ho aggiunto un altro per â € ¢ (proiettili di primo livello che avevo). –

Problemi correlati