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

Convertire i set di caratteri con la libreria mbstring

Usare la libreria mbstring per l'internazionalizzazione e la conversione dei set di caratteri in Php. Breve guida all'uso.
Usare la libreria mbstring per l'internazionalizzazione e la conversione dei set di caratteri in Php. Breve guida all'uso.
Link copiato negli appunti

La settimana scorsa ho fatto una breve introduzione all'argomento internazionalizzazione, evidenziando l'utilità di sviluppare le proprie pagine web in modo che siano fruibili da utenti appartenenti a culture differenti che utilizzano un insieme di caratteri differente dal nostro. Abbiamo introdotto la libreria iconv che permette la conversione tra charset differenti, ed abbiamo visto come impostare le nostre pagine in modo da avere il controllo sulla codifica utilizzata dal browser per inviarci i dati. In questo articolo procederemo con la scaletta che avevo proposto settimana scorsa introducendo la libreria mbstring che implementa una serie di funzionalità molto ampia per la gestione di set di caratteri multibyte.

La libreria mbstring

La libreria mbstring è un'estensione non standard per Php. Viene distribuita con il pacchetto ufficiale di estensioni, ma è necessario specificarne l'inclusione in fase di compilazione oppure indicarne l'inclusione dinamica su sistemi non POSIX. Per includere la libreria in fase di compilazione, dobbiamo specificare alcune direttive da aggiungere durante la generazione della configurazione:

  • --enable-mbstring=LANG: abilita la libreria mbstring installando il supporto per la lingua specificata con LANG. Se si vuole installare il supporto per tutte le lingue gestite dalla libreria, è possibile specificare all come valore. Le lingue supportate sono elencate sulla pagina specifica della libreria nella guida ufficiale di Php;

  • --enable-mbstr-enc-trans: abilita la trasformazione automatica dei dati in input utilizzando la codifica interna, specificata nel file php.ini come spiegato più avanti nell'articolo;

  • --enable-mbregex: abilita le funzioni per la gestione delle espressioni regolari con supporto alle stringhe multibyte;

Dopo aver configurato e compilato correttamente Php, è necessario specificare alcune direttive nel file php.ini al fine di controllare il corretto funzionamento della libreria. Vediamo le più importanti:

  • mbstring.language: una stringa rappresentante la lingua standard utilizzata dall'applicazione. In base al valore di questa opzione di configurazione viene anche impostato il valore di mbstring.internal_encoding (che può comunque essere modificato manualmente);

  • mbstring.http_input:  specifica la codifica standard dei dati provenienti in input tramite HTTP;

  • mbstring.http_output: specifica la codifica standard dei dati restituiti in output;

  • mbstring.internal_encoding: specifica la codifica standard utilizzata internamente dalla libreria. In caso non sia specificato esplicitamente, il valore di questa direttiva viene ricavato dal valore di mbstring.language;

  • mbstring.func_onverload: specifica se sostituire le funzioni standard di Php per la gestione delle stringhe con quelle specifiche della libreria mbstring aventi il supporto per i byte multipli. Questa direttiva è molto interessante, perché facilita l'eventuale porting di applicazioni che supportano solamente la gestione standard delle stringhe di Php ad applicazioni con il supporto per codifiche alternative;

Terminata la configurazione siamo pronti per utilizzare la nostra libreria.

Le funzionalità più importanti

Negli esempi che mi appresto a trattare presuppongo che la direttiva mbstring.func_overload sia settata a zero e che si debbano utilizzare esplicitamente le funzioni specifiche della libreria. In caso la direttiva fosse impostata ad un altro valore (1 se si vuole includere il supporto per l'invio di email codificate, 2 se si vuole includere il supporto per le stringhe e 4 se si vuole includere il supporto per le espressioni regolari), basterebbe sostituire le funzioni in base alla tabella che illustrerò successivamente.

Supponiamo che l'impostazione specificata nel file php.ini sia la seguente:

mbstring.language = Italian

mbstring.internal_encoding = ISO-8859-1

mbstring.http_input = auto

mbstring.http_output = UTF-8

mbstring.func_overload = 0

In questo modo abbiamo specificato l'utilizzo di ISO-8859-1 come charset interno e di output, mentre abbiamo lasciato alla libreria l'onere di assegnare automaticamente il charset da utilizzare per i dati in input. I nostri file andranno salvati nella codifica specificata come internal_encoding (nel caso fosse UTF-8 ricordiamoci di non includere l'header BOM).

Per prima cosa è bene ricordare che è necessario specificare sempre il charset utilizzato attraverso un corretto header HTTP. Anche se i browser odierni hanno sistemi che riescono ad interpretare in modo quasi sempre corretto la codifica della pagina, è bene indirizzarli per facilitargli il lavoro ed assicurarci che l'output sia visualizzato correttamente.

<?php
/* Ricordiamoci sempre di specificare il charset
utilizzando l'header content-type */

header('Content-type: text/html;charset='.mb_http_output());

?>

Presa questa breve precauzione, possiamo iniziare con il testing dei dati. Per prima cosa prepariamo una semplice pagina HTML che invierà i dati ad uno script Php che andrete a modificare ogni volta per provare le funzioni più importanti:

<!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>
        <form method="post" action="testmbstring.php">
                  <label>Messaggio</label>
                  <input type="text" name="message" />
                  <input type="submit" name="action" value="Invia" />
            </form>
    </body>

</html>

Questa pagina invierà la stringa specificata al file testmbstring.php, che opererà su $_POST['message'].

Le prime funzioni da analizzare e testare sono quelle che sostituiscono le controparti standard fornite da Php per la gestione delle stringhe a byte singolo. Le funzioni in questione e la relativa controparte in Php sono:

MBSTRING           |  Php
-----------------------------------------------

mb_send_mail()    |  mail()

mb_strlen()       |  strlen()

mb_strpos()       |  strpos()

mb_strrpos()      |  strrpos()

mb_substr()       |  substr()

strtolower()      |  mb_strtolower()

strtoupper()      |  mb_strtoupper()

substr_count()    |  mb_substr_count()

ereg()            |  mb_ereg()

eregi()           |  mb_eregi()

ereg_replace()    |  mb_ereg_replace()

eregi_replace()   |  mb_eregi_replace()

split()           |  mb_split()

Tutte le funzioni in questione operano sulle stringhe in modo analogo alla controparte standard, operando però in base alle impostazioni della libreria mbstring. L'utilizzo è molto semplice ovviamente, anche se è importante ricordare che è possibile specificare un parametro finale aggiuntivo per indicare il charset da utilizzare per l'operazione effettuata (in alternativa viene utilizzato mbstring.internal_encoding):

<?php

header('Content-type: text/html;charset='.mb_http_output());

function msb($m, $s, $c)
{
      echo $m." ".$s." (Php: ".$c.")<br />";
}

$str = $_POST['message'];

msg('Lunghezza della stringa:', mb_strlen($str), strlen($str));
msg('Stringa uppercase:',   mb_strtoupper($str), strtoupper($str));
msg('Sottostringa 3:7',    mb_substr($str, 3, 7), substr($str, 3, 7));

// ...

?>

Giocando un po' con la configurazione di mbstring è possibile testare il suo funzionamento anche con altri caratteri (come il cinese, il giapponese o il russo) per notare l'enorme differenza di risultati rispetto a Php.

Una funzione di utilità molto interessante è mb_convert_encoding, che permette di effettuare la conversione tra due differenti codifiche oppure tra la codifica specificata e quella interna nel caso in cui non venga specificato un terzo parametro. Questa funzione può risultare molto utile nel caso in cui si lavori con dati che provengono da fonti che hanno deciso di utilizzare una codifica interna differente rispetto a quella standard da noi utilizzata. Nel caso in cui si voglia applicare la conversione direttamente sui valori contenuti in una variabile è possibile utilizzare la funziona ausiliaria mb_convert_variables, che accetta come parametri aggiuntivi rispetto alla precedente delle variabili che verranno modificate in place.

Nel caso in cui fosse necessario effettuare il parsing di dati raw inviati via post o get, è possibile utilizzare la funzione mb_parse_str che si occupa in automatico di recuperare la codifica della stringa e modificare le variabili globali $_GET e $_POST di conseguenza.

Conclusioni

Purtroppo lo spazio è tiranno ma la libreria che abbiamo trattato oggi non richiede una grande attenzione pratica per essere utilizzata, quindi ritengo che l'infarinatura data oggi sia abbastanza per dare il via ai vostri test personali. Ricordatevi che è importante provare varie soluzioni e situazioni al fine di comprendere correttamente il funzionamento della libreria e la teoria correlata. Nel prossimo articolo vedremo brevemente una soluzione implementata manualmente per la gestione delle stringhe multibyte in modo da capire come poter implementare il supporto a questa soluzione anche nelle situazioni in cui non è possibile operare sul server per la riconfigurazione.

Ti consigliamo anche