Quante volte vi è capitato di perdere dei pomeriggi interi nel sistemare gli accenti o i caratteri strani, dopo un trasferimento online di un sito che in locale funzionava senza problemi?
Il problema probabilmente risiede nella codifica del database (nel nostro caso mysql) e in come il server interpreta i dati provenienti dal database.
Dopo diverse prove, spesso infruttuose, e rattoppamenti (la funzione str_replace
può permettervi di sostituire i caratteri “strambi” con quelli voluti, ma si tratta di un metodo instabile e sporco), sono arrivato a farmi un’idea abbastanza precisa su come ovviare al problema. A posteriori, con un po’ di logica sembra tutto semplice.
In questa sede presuppongo di interfacciarmi, tramite php, a un server mysql e che i campi delle tabelle dove andrà salvato il testo abbia la codifica “latin1_swedish_ci”. E’ chiaro che impostando una codifica diversa ai campi (per esempio UTF-8), lo script potrebbe non funzionare correttamente e debba essere di conseguenza modificato.
Inoltre prendo per assodato che il file php abbia, di suo, una codifica UTF-8.
Codificare i dati estratti dal database in UTF-8
Una volta che avete completato la connessione al database, quello che dovete fare è settare l’intero contenuto dei dati estratti dal database in UTF-8. Per intenderci:
1 2 3 4 5 6 7 8 9 10 11 |
$db_host = "host"; $db_user = "username"; $db_password = "password"; $database = "nome_database"; $db = mysql_connect($db_host, $db_user, $db_password); if ($db == FALSE) die ("Errore nella connessione. Verificare i parametri nel file config.inc.php"); mysql_select_db($database, $db) or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php"); mysql_query("SET NAMES 'utf8';"); |
Meglio ancora, l’ultima funzione dovrebbe essere sostituita dalla funzione mysql_set_charset
:
1 |
mysql_set_charset('utf8'); |
Dopodiché, potrete inserire ed estrarre il testo dal database senza l’uso di altre funzioni. In alternativa al codice presentato qui sopra, avremmo potuto formattare il testo usando la funzione iconv
. Nell’inserimento in un campo del database, proveniendo da un input, useremo:
1 |
$stringa=iconv("UTF-8", "ISO-8859-1", $stringa); |
mentre per estrarre il campo dal database e mostrarlo a video, useremo:
1 |
$stringa=iconv("UTF-8//IGNORE", "ISO-8859-1", $stringa); |
Gestire dati già presenti nel database in altre codifiche
In gran parte dei casi, il procedimento dovrebbe risolvere il problema. Può capitare però che abbiate dei dati già salvati nel database (per esempio, perché li avete esportati da un altro database) e che stampandoli a video vi appaiano i classici simboli di errore di codifica. Una prova che potete fare è la seguente:
1 |
$stringa=iconv("UTF-8", "ISO-8859-1//IGNORE", $stringa); |
Nel caso in cui il file php non sia codificato per l’UTF-8 e vogliate mantenerlo, per qualche motivo, in codifica ISO, per visualizzare esattamente i dati salvati nel database potete provare con:
1 |
$stringa=iconv("ISO-8859-1//IGNORE", "UTF-8", $stringa); |
Come vedete, il succo del discorso è di provare a smanettare (con logica) sulle funzioni di decodifica. Oltre alle funzioni presentate, provate a dare un’occhiata anche a utf8_decode
e alla sua controparte, utf8_encode
.
Ho finalmente risolto i miei problemi con i caratteri.
Grazie!
Non c’è di che =)
Le codifiche sono sempre delle brutte bestie da addomesticare…
Grazie, mi hai salvato la serata!!!!
Prego 😉
Ma se ho caratteri come questi:
(dal greco antico: ἀν-ἀρχή, (dal greco antico, ἀν, assenza + ἀρχός, leader o governatore)
Riesco a inserirli nel database tranquillamente ma non riesco a prelevarli, vengono sostituiti con ??
Ho inserito: mysql_set_charset(‘utf8’,$connessione);
hai qualche idea?
Non ho mai usato caratteri della lingua greca, ma dovrebbe essere sufficiente avere la codifica utf8 per il database.
Prova a usare la funzione iconv qui sopra quando estrai le singole stringe