2011-09-10 6 views
7

Per consentire al sito Web di accettare i contenuti inviati dall'utente che potrebbero non essere in inglese (ad esempio giapponese) e salvarlo nel database, è nel mio interesse a utf8_encode tutto il nuovo contenuto e user utf8_decode quando lo si recupera in seguito?Internazionalizzare le best practice sui contenuti per l'utilizzo di utf8_encode() (funzione php)

Ulteriori informazioni: Sto usando dottrina e sto ottenendo un errore quando si tenta di salvare o selezionare i caratteri Unicode al database MySQL:

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

+0

Si prega di includere lo schema della tabella in questo. E possibile fornire il PIENO sql? <- Suggerimento (problema di confronto) – ajreal

+0

Hai bisogno di maggiori informazioni: Quali sono le regole di confronto utilizzate dalle tue tabelle? –

+0

possibile duplicato di [UTF-8 fino in fondo] (http://stackoverflow.com/questions/279170/utf-8-all-the-way-through) – mercator

risposta

8

Non è necessario utilizzare la funzione di codifica. Quello che devi fare è assicurarti di essere UTF8 end-to-end. Sembra che il database possa utilizzare la codifica e le regole di confronto latin1. Anche la tua connessione al database deve essere UTF8. A volte basta semplicemente eseguire la query SET NAMES UTF8 subito dopo aver stabilito una connessione.

L'esecuzione di questo comando in mysql risolverà probabilmente l'errore visualizzato in precedenza, ma è comunque necessario essere UTF8 end-to-end. Quindi non devi fare nulla di speciale con i tuoi dati.

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
5

Brent ha ragione. Deve essere end-to-end. Ecco la mia lista:

Apache config: 
    AddDefaultCharset UTF-8 
    AddCharset UTF-8 .utf8 

php.ini: 
    default_charset = "utf-8" 

MySQL: 
    ALTER DATABASE DEFAULT CHARACTER SET utf8; 
    ALTER TABLE SomeTableName DEFAULT CHARACTER SET utf8; 

PHP/HTML: 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    … 
    <form … <input type="text" name="some_field" value="<?php echo htmlspecialchars($row['some_field'], ENT_COMPAT, 'UTF-8'); ?>"… 

This last one seems the most important. Call this function immediately after the mysql_connect() call: 
    mysql_query("SET NAMES 'utf8'");