Utilizzare Php e MySql con il Charset UTF-8
Uno dei problemi più frequenti nella creazione di siti, soprattutto se utilizzati da utenti di varie nazionalità, è quello di dover salvare nel database e visualizzare caratteri strani utilizzati da altre lingue, per esempio strighe come Iñtërnâtiônàlizætiøn, bisogna quindi utilizzare un charset adeguato in grado di poter visualizzare ogni tipo di carattere esistente, come charset UTF-8, in grado di visualizzare quasi tutte le lingue vive e alcune lingue morte, oltre al Klingon, ben conosciuto dai fan di Star Trek.
Per fare questo dobbiamo agire su tre fonti:
- Le nostre pagine Html devono avvertire il browser che il testo è codificato in UTF-8
- Il nostro interprete Php deve usare come charset di default UTF-8
- Il nostro database MySql deve, anche lui, utilizzare UTF-8 come charset di default
Procediamo alla realizzazione:
Per prima cosa, in ogni pagina html, dobbiamo avvertire il browser che il testo contenuto nella pagina html sarà codificato in UTF-8. Per far questo basta aggiungere, nell’head della pagina html, il seguente meta tag:
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> |
Poi dobbiamo configurare il Php, e per fare questo basta editare php.ini e aggiungere o modificare, se gia esistente, il default charset come segue:
default_charset = "utf-8"
e riavviare il server web.
Manca solo MySql, che sfortunatamente è un pò più incasinato come procedimento, ma neanche tanto. Per prima cosa anche per la configurazione di MySql, nella sezione [mysqld] del suo file di configurazione my.cnf, aggiungiamo il charset di default come segue:
character-set-server=utf8 default-collation=utf8_unicode_ci
e riavviare il server mysql.
Poi bisogna creare un database che usi UTF-8 come charset, quindi nella stringa di creazione del database bisogna specificarlo come segue:
CREATE DATABASE miodb CHARACTER SET utf8; |
Stesso discorso vale anche per le tabelle, di seguito un esempio di creazione di una tabella con il supporto per UTF-8:
CREATE TABLE `mytable` ( `id` int(11) PRIMARY KEY AUTO_INCREMENT, `text` varchar(255) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
A questo punto, se vi connettete al vostro database tramite linea di comando o phpMyAdmin, ed eseguite la seguente query:
mysql> SHOW VARIABLES LIKE 'c%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | | collation_connection | latin1_swedish_ci | | collation_database | utf8_general_ci | | collation_server | utf8_unicode_ci | | completion_type | 0 | | concurrent_insert | 1 | | connect_timeout | 5 | +--------------------------+----------------------------+
potete notare che benchè il database usi UTF-8, la connessione usa LATIN1, dovete quindi dire al database che la vostra connessione usera UTF-8 tramite la query:
mysql> SET NAMES utf8; Query OK, 0 rows affected (0.00 sec)
ora rieseguendo la query precedente vediamo che finalmente è tutto in UTF-8
mysql> SHOW VARIABLES LIKE 'c%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_unicode_ci | | completion_type | 0 | | concurrent_insert | 1 | | connect_timeout | 5 | +--------------------------+----------------------------+ 14 rows in set (0.00 sec)
Ovviamente questo lavoro deve essere fatto ad ogni connessione con il database, quindi dal vostro codice php, appena dopo la connessione allo stesso, dovrete rifare lo stesso lavoro, tramite il seguente codice:
// Make sure any results we retrieve or commands we send use the same charset and collation as the database: $db_charset = mysql_query( "SHOW VARIABLES LIKE 'character_set_database'" ); $charset_row = mysql_fetch_assoc( $db_charset ); mysql_query( "SET NAMES '" . $charset_row['Value'] . "'" ); unset( $db_charset, $charset_row ); |
un ultimo appunto, in alcune funzioni php, ad esempio htmlentities, bisognera specificare il charset per vedere il risultato, in questo caso UTF-8
htmlentities("Iñtërnâtiônàlizætiøn", ENT_COMPAT, 'UTF-8'); |
ed ora, finalmente, abbiamo finito!

aprile 10th, 2008 at 17:42
un sentito ringraziamento per il contenuto e la chiarezza. Avevo un problema simile mi ha aiutato parecchio.
Grazie!
aprile 26th, 2008 at 12:53
Una guida fondamentale e soprattutto scritta con grande precisione.
Grazie infinite per questo tuo contributo!
maggio 21st, 2008 at 20:41
Eccezzionale veramente!
Dopo tante peregrinazioni senza approdo finalmente una guida precisa, chiara e completa (che mi ha risolto parecchi problemi)!
settembre 10th, 2008 at 19:45
Anche io desidero ringraziarti per la grande chiarezza che mi ha permesso finalmente di capire definitivamente la questione e risolvere tutti i miei guai di codifica!
giugno 3rd, 2009 at 12:36
Grazie mille davvero, con il mod_rewrite è veramente un grosso ostacolo da superare la codifica, ora posso pure usare gli accenti negli url!
giugno 8th, 2009 at 03:46
Questa chiara guida mi ha salvato da molte emicranie.. solo un appunto:
non htmlentities(” Iñtërnâtiônàlizætiøn”, ENT_COMPAT, UTF-8);
ma htmlentities(” Iñtërnâtiônàlizætiøn”, ENT_COMPAT, ‘UTF-8′);
pena un “simpatico” notice :)
luglio 24th, 2009 at 11:39
Bella guida, complimenti!
agosto 5th, 2009 at 17:46
Informazioni utilissime!!! Vorrei solo aggiungere un tip che mi ha fatto perdere ben 2 giorni: se volete fare una UPDATE o INSERT su una tabella, ricordatevi di codificare i parametri che passate alla query con la funzione “utf8_encode”, in modo da poter utilizzare anche i caratteri accentati.
ottobre 11th, 2009 at 01:20
ti ringrazio di cuore.Esauriente, chiaro e conciso.
marzo 31st, 2010 at 17:47
GRAZIE …. erano 25 gg che impazzivo su sto problema … davvero non ho parole.
chiunque abbia fatto questa guida è un mito.
aprile 10th, 2010 at 09:32
Mi associo:
dopo tanto pellegrinare tra siti di ogni genere e in qualsiasi lingua, una guida esauriente e veloce da capire.
GRAZIE
ottobre 26th, 2012 at 17:25
Grazie mille, ottimo lavoro!