Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Convertire i set di caratteri con la libreria iconv

Primi passi verso l'internazionalizzazione delle proprie applicazioni in Php: come si usa e a cosa serve la libreria iconv
Primi passi verso l'internazionalizzazione delle proprie applicazioni in Php: come si usa e a cosa serve la libreria iconv
Link copiato negli appunti

L'importanza di versioni internazionali

Più cresce l'importanza dei propri progetti,
più si sente la
necessità di svilupparli in modo che siano fruibili ed
utilizzabili dal
maggior numero di culture e paesi possibili. Grazie ad Internet le
nostre applicazioni possono finire in mano a persone di qualunque
nazione del mondo, e possono essere utilizzate inserendo informazioni
composte dai set di caratteri più differenti. Queste
esigenze hanno
portato alla nascita di una serie di standard e di tecnologie adatte a
supportare lo sviluppo di applicazioni "internazionali"; questi
standard permettono di unificare il modo in cui vengono rappresentati i
caratteri che compongono le parole di una determinata lingua, al fine
di supplire ai limiti imposti dalla rappresentazione dei caratteri
utilizzando il sistema ASCII.

Varie soluzioni sono state proposte, ma una sopra tutte
è
diventata ormai uno standard: Unicode. Il
consorzio che ha studiato e tuttora si occupa dell'evoluzione di questo
standard ha reso disponibili una serie di regole che permettono di
rappresentare un enorme numero di simboli e caratteri sfruttando
più di
un singolo byte. Questo insieme di regole, giunto alla versione 4.0,
permette la compatibilità con l'ASCII ed altri standard
affermati ed
assicura una basso dispendio di byte. Oltre a questo lavoro, il
consorzio Unicode distribuisce una serie di tabelle per la conversione
tra differenti charset, facilitando l'implementazione di soluzioni
adatte alle esigenze più particolari.

Ora che abbiamo compreso l'importanza di rendere le nostre
applicazioni adatte ad essere utilizzate in ambienti con lingua e
cultura differente, ed ora che siamo a conoscenza dell'esistenza di un
ente che si occupa di fornire standard per raggiungere questo compito,
possiamo analizzare le soluzioni offerte da Php
per facilitarci l'internazionalizzazione e la localizzazione delle
applicazioni.

Purtroppo Php (fino alla versione 5) non fornisce un supporto
nativo alle stringhe multibyte: le
funzioni che operano sulle stringhe difatti trattano l'insieme di
caratteri elaborando un singolo byte per volta. Dato che l'input da
dispositivi con charset differenti (vedasi il giapponese o le lingue
arabe per esempio) arriva a Php sotto forma di stringhe multibyte,
otterremo sempre degli errori quando opereremo utilizzando le funzioni
builtin.

A fronte di questo problema le soluzioni che si possono
utilizzare per la conversione tra charset e la corretta analisi degli
stream sono l'implementazione di librerie fatte in casa oppure, nel
caso in cui il server che utilizziamo disponga dei requisiti necessari,
utilizzare le estensioni mbstring ed iconv.
Entrambe le soluzioni verranno analizzate su HTML.it in questo e in
altri articoli.

Oltre al problema della conversione tra charset e la corretta
interpretazione delle stringhe multibyte, abbiamo quello di rendere i
nostri script capaci di generare output differente
in base alla lingua dell'utilizzatore. Anche per questo problema
abbiamo due soluzioni differenti che analizzeremo in seguito:
utilizzare la libreria gettext oppure implementare librerie e tool personalizzati. La seconda soluzione è necessaria quando ci interfacciamo con dei database e vogliamo ottenere dati diversi in base alla lingua.

Specificare la codifica delle nostre pagine web

Prima di iniziare a trattare nello specifico gli argomenti
sopra elencati, è necessario puntualizzare che,
affinché i nostri
script si comportino in modo corretto qualunque sia la situazione in
cui vengono eseguiti, è necessario conoscere con esattezza
la codifica
dei dati in input
e sapere la codifica dei dati da
utilizzare per l'output. Se questo problema non sussiste nel caso in
cui si stia operando sulle stringhe scritte manualmente in uno script
(difatti possiamo praticamente sempre scegliere la codifica in cui
salvare i nostri file), risulta invece evidente quando si ha a che fare
con la gestione dei dati in input provenienti dal browser.

In questo caso è fondamentale configurare la
pagina HTML e
restituire gli header corretti affinché i nostri script
funzionino
correttamente ed affinché l'output sia visualizzato
correttamente
dall'utente. Prima di generare qualunque output attraverso uno script
Php è buona norma utilizzare la funzione header
per specificare la codifica che il browser dovrà utilizzare
per leggere
i dati generati:

<?php

/* Specifichiamo la codifica di
caratteri che il browser
dovrebbe utilizzare per interpretare l'output della nostra
pagina HTML */

header('Content-Type: text/html;charset=UTF-8');

?>

La stessa operazione può essere ovviamente
compiuta per
specificare la codifica di qualunque altro tipo di output volessimo
generare. Oltre questo accorgimento è buona norma
specificare la
codifica anche all'interno della pagina HTML:

<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
       
<meta content="text/html; charset=UTF-8"
http-equiv="content-type" />
       
<title>Pagina di prova</title>
    </head>
    <body>
       
<strong>Contenuto che verrà interpretato
utilizzando il set UTF-8 della codifica Unicode</strong>
    </body>
</html>

Seguendo questi due semplici accorgimenti si
conoscerà a
priori il set di caratteri accettato ed inviato dal browser. Nel caso
in cui non si seguissero queste precauzioni, il browser utilizzerebbe
un charset scelto tramite regole specifiche (per esempio quello di
default utilizzato dal sistema operativo, oppure un charset ipotizzato
sulla base della lingua dell'applicazione utilizzata) e quindi
risulterebbe molto più complicato risalire al charset
utilizzato.

Conversione utilizzando le librerie iconv

La prima soluzione che andrà ad analizzare per la
conversione
tra set di caratteri è l'utilizzo della libreria
iconv
.
La libreria in questione si appoggia a quella omonima di sistema per
effettuare la conversione di una stringa tra due set di caratteri
differenti. Sui sistemi POSIX la libreria iconv
viene fornita di sistema e quindi non è necessario nessun
prerequisito
per l'installazione se non un eventuale aggiornamento della libreria
usando la versione sviluppata nell'ambito del progetto GNU (libiconv)
in caso venga generato un output errato. Su altri sistemi invece
è
necessaria l'installazione della libreria libiconv,
e su Windows è necessario aggiungere alla cartella delle
proprie
estensioni il file iconv.dll che è possibile reperire dalle
librerie
precompilate fornite sul sito di PHP. Per l'installazione
delle
estensioni si può fare riferimento alla nostra guida su Php
su Windows
o Php
su Linux
.

Come accennato la libreria iconv
permette la conversione di stringhe tra charset
differenti
; per permettere il corretto funzionamento
della libreria è necessario configurarla al fine di
assegnare la
codifica di default da utilizzare per la conversione dei dati in input
e quella da utilizzare per i dati in output. Tre sono le direttive che
possiamo modificare nel file php.ini per
controllare questo comportamento:

  • iconv.input_encoding: specifica
    la codifica da utilizzare automaticamente quando si effettuano
    operazioni sui dati in input

  • iconv.output_encoding:
    specifica la codifica da utilizzare automaticamente quando si
    restituisce dell'output

  • iconv.internal_encoding:
    specifica la codifica utilizzata internamente dalla libreria

La scelta dei valori da utilizzare dipende dalla codifica dei
dati che ci aspettiamo in input. Nel caso di applicazione web, le
stringhe che arrivano in input sono codificate dal browser seguendo le
regole descritte nel paragrafo precedente. I valori potranno
eventualmente essere modificati utilizzando la funzione iconv_set_encoding
e recuperati utilizzando iconv_get_encoding.

Una volta configurata correttamente la libreria e prese le
precauzioni necessarie per quanto riguarda la codifica dell'output e
dell'input, è possibile iniziare ad utilizzarla:

<?php

// Assegno la codifica da utilizzare

iconv_set_encoding('input_encoding', 'UTF-8');
iconv_set_encoding('output_encoding', 'UTF-8');

// Specifico il content type

header('Content-Type: text/html;charset=UTF-8');

// un semplice output d'esempio
$content = <<<CONT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
       
<meta content="text/html; charset=UTF-8"
http-equiv="content-type" />
       
<title>Pagina di prova</title>
    </head>
    <body>
       
<strong>Stringa corretta:</strong>
%s <br />
       
<strong>Stringa errata:</strong> %s
<br />
    </body>
</html>
CONT;

/* Codifico il contenuto in UTF-8 e
lo restituisco in output
*/

$content = iconv('ISO-8859-1', 'UTF-8', $content);
printf($content, iconv('ISO-8859-1', 'UTF-8', 'Prima o poi PHP 6
uscirà'), 'Prima o poi PHP 6 uscirà');

?>

Questo script può essere salvato in un file
utilizzando la
codifica standard ISO-8859-1, ma una volta eseguito il suo output
verrà
codificato utilizzando il charset UTF-8
in modo che il browser visualizzi il testo in modo corretto. In questo
caso abbiamo solamente una piccola discrepanza tra le stringhe ma,
com'è facilmente intuibile, i problemi potrebbero diventare
molto più
grossi nel caso in cui l'output fosse in una lingua che non utilizza
caratteri latini.

Come possiamo notare, la funzione iconv
si occupa materialmente di effettuare la conversione di una stringa tra
la codifica passata come primo parametro e quella passata come secondo.
Volendo è possibile convertire tutto l'output generato in
una volta
sola, senza doversi occupare della conversione di ogni singola stringa,
utilizzando un output handler specifico in congiunzione che le funzioni
di output buffering:

<?php

// Salviamo questo file in ISO-8859-1

ob_start('ob_iconv_handler');

header('Content-Type: text/html;charset=UTF-8');
echo 'Prima o poi PHP 6 uscirà';

?>

La funzione ob_iconv_handler
utilizza il valore della variabile di configurazione output_encoding
per codificare tutto l'output generato.

La libreria iconv fornisce anche delle funzioni
per sostituire quelle di default per la gestione delle stringhe. Le
funzioni sono quattro, ed accettano tutte gli stessi parametri delle
omonime funzioni builtin di Php con in aggiunta un parametro opzionale
per specificare il charset da utilizzare (in alternativa viene
utilizzato internal_charset):

  • iconv_strlen: calcola la
    lunghezza di una stringa

  • iconv_substr: estrae da una
    stringa una porzione di lunghezza ed inizio specificati

  • iconv_strpos: trova la
    posizione della prima occorrenza di una parola all'interno di una
    stringa

  • iconv_strrpos: trova la
    posizione dell'ultima occorrenza di una parola all'interno di una
    stringa

Oltre a questo la libreria iconv fornisce delle funzioni per
la codifica e la decodifica di header mime, che consiglio di studiare a
chiunque fosse interessato ad approfondire l'argomento.

Prime conclusioni

In questo primo articolo ho cercato di farvi una breve
panoramica delle esigenze che un'applicazione può richiedere
nel caso
in cui si voglia renderla correttamente fruibile a persone con lingua e
culture diverse. Abbiamo visto come impostare le nostre pagine HTML ed
i nostri script affinché il browser interpreti i caratteri
usando le
regole da noi richieste ed abbiamo dato un'occhiata alla semplice
libreria iconv, che permette la conversione di stringhe tra set di
caratteri differenti. Nel prossimo articolo analizzerà in
dettaglio la libreria
mbstring
per la gestione delle stringhe multibyte,
fornendo qualche esempio di funzionamento e paragonandola con altre
eventuali alternative possibili.

Ti consigliamo anche