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 aggire 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!

4 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!

Lascia un commento

Categorie

Cerca

Meta