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!

Be Sociable, Share!

12 Responses to “Utilizzare Php e MySql con il Charset UTF-8”

  1. carlo Says:

    un sentito ringraziamento per il contenuto e la chiarezza. Avevo un problema simile mi ha aiutato parecchio.
    Grazie!

  2. Luca Says:

    Una guida fondamentale e soprattutto scritta con grande precisione.
    Grazie infinite per questo tuo contributo!

  3. Giulio Says:

    Eccezzionale veramente!
    Dopo tante peregrinazioni senza approdo finalmente una guida precisa, chiara e completa (che mi ha risolto parecchi problemi)!

  4. Marco Says:

    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!

  5. Giacomo Says:

    Grazie mille davvero, con il mod_rewrite è veramente un grosso ostacolo da superare la codifica, ora posso pure usare gli accenti negli url!

  6. guidoz Says:

    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 :)

  7. Abidibo Says:

    Bella guida, complimenti!

  8. Luca Zavarella Says:

    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.

  9. mela Says:

    ti ringrazio di cuore.Esauriente, chiaro e conciso.

  10. Silvio Troia Says:

    GRAZIE …. erano 25 gg che impazzivo su sto problema … davvero non ho parole.

    chiunque abbia fatto questa guida è un mito.

  11. Andrea Says:

    Mi associo:
    dopo tanto pellegrinare tra siti di ogni genere e in qualsiasi lingua, una guida esauriente e veloce da capire.
    GRAZIE

  12. edo Says:

    Grazie mille, ottimo lavoro!

Lascia un commento

Categorie

Cerca

Meta