La migrazione dal vecchio al nuovo server potrebbe creare alcuni disagi soprattutto ai vecchi clienti che utilizzano applicazioni dinamiche o semplici pagine web HTML sviluppate utilizzando il charset Latin1(ovvero l’ISO-8859-1); il nuovo server infatti opera in UTF-8 sia nella distribuzione delle pagine web (su Apache) che nell’archiviazione delle informazioni nel database MySQL. Il problema si manifesta prevalentemente durante la visualizzazione di caratteri speciali quali le lettere accentate (àèìòùé…) o altri caratteri non standard (°…).

Per maggiore semplicità riporto un breve vademecum sulla conversione dei contenuti da ISO-8895-1 a UTF-8 in modo da limitare i possibili disservizi che si potrebbero riscontrare.

Conversione di contenuti statici (files JavaScript, HTML ecc..)

Qualora fosse stato utilizzato Dreamweaver assicurarsi di specificare UTF-8 come charset per la generazione delle pagine web del proprio progetto. Questo cambiamento comporta, in genera, la conversione dei files del progetto dal vecchi al nuovo formato e la sostituzione del meta-tag Content-Type da ISO-8859-1 a UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Completata la conversione del progetto è necessario caricare, via FTP, i nuovi files HTML nella cartella /httpdocs/

Conversione di siti dinamici (con database MySQL)

In generale la conversione di un sito dinamico da ISO-8859-1 a UTF-8 è un’operazione particolarmente complessa e che potrebbe richiedere più di qualche ora di lavoro a seconda, ovviamente, dell’entità del progetto. La conversione del progetto si estende su due livelli: 1. Livello dati 2. Livello applicazione   - Conversione a livello dati Gran parte dei siti sviluppati in ISO-8859-1 fanno uso di tabelle memorizzate in MySQL utilizzando il charset latin1_*. La conversione di tale tipi di dati potrebbe limitarsi all’esecuzione di un numero ristretto di query SQL necessarie per convertire le tabelle e i dati in esse contenute da latin1_* a utf8_*. Nello specifico dovrà essere eseguita la query sottostante per ciascuna tabella presente nel sito sostituendo opportunamente tableName con il nome della tabella da convertire.

ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Nella maggior parte dei casi non dovrebbero presentarsi problemi di conversione ma potrebbe, in taluni casi, generare un errore interno n°150.

Tale errore si presenta solitamente qualora si utilizzi tabelle InnoDB con relazioni attive su chiavi di tipo stringa; in questo caso la conversione del database (o delle tabelle in questione) potrebbe non concludersi correttamente. In tal caso potrebbe essere necessario intervenire direttamente nel server per fare un dump completo del Database, convertirlo utilizzando iconv da ISO-8895-1 a UTF-8, effettuare una ricerca e sostituzione veloce della direttiva CHARSET da latin_1 a utf_8, cancellare il vecchio database (o le vecchie tabelle) e caricare il nuovo dump MySQL opportunamente modificato.

Sintetizzando:

mysqladmin --opt -umioUtente -p mioDB > ./mioDB_latin1.sql
****
iconv -c -f latin1 -t utf-8 ./mioDB_latin1.sql > mioDB_utf8.sql

A questo punto aprire il nuovo documento mioDB_utf8.sql con un editor di testo (che possibilmente lavori in UTF-8), cercare la stringa “CHARSET=latin1″ e sostituirla con “CHARSET=utf8″.

mysql -umioUtente -p
****
use mioDB
\. ./mioDB_utf8.sql 

A questo punto non resta che convertire gli scripts PHP in modo da non interferire con il charset UTF-8.

- Conversione a livello applicazione

Per il completamento di questa seconda fase di lavoro è consigliato scaricare l’intera cartella /httpdocs nel proprio computer e operare con un editor di testo che consenta la ricerca globale del testo all’interno di un progetto (sotto Mac consiglio l’uso di TextMate).

Il primo aspetto da tenere in considerazione è che la funzione htmlentities() opera in ISO-8859-1 di default e spesso è la causa dei problemi di visualizzazione dei testi delle pagine dinamiche. Per risolvere questo problema si può optare per una delle due soluzioni disponibili:
1. completamento della chiamata alla funzione
2. conversione della funzione

Completamento della chiamata alla funzione

Per rendere la funzione htmlentities() compatibile con il charset UTF-8 è necessario aggiungere come secondo parametro la constante ENT_QUOTES e come terzo parametro la stringa ‘utf-8′

// Esempio di chiamata alla funzione pre-utf8
echo htmlentities($rs->nome);

// Ecco come deve essere modificata la chiamata alla funzione:
echo htmlentities($rs->nome, ENT_QUOTES, 'utf-8');

Tale soluzione potrebbe non essere una delle migliori dovendo intervenire con una regular expression per la sostituzione di tutte le chiamate ad htmlentities() del proprio progetto. Qualora non si disponga di sufficiente pazienza si consiglia di optare per la soluzione 2, altrettanto efficace e meno impegnativa.

Conversione della funzione

La funzione htmlentities() può essere nella maggior parte dei casi sostituiti da htmlspecialchars().
La prima infatti tende ad interferire con i caratteri speciali quali le lettere accentate andandole a sostituire con gli equivalenti in HTML (per esempio è diventa &egrave;). La seconda invece si limita a convertire un set limitato di caratteri quali il maggiore e il minore, la e commerciale, il singolo e il doppio apice in entità HTML (per esempio la e commerciale & diventa &amp;)

// Esempio di chiamata alla funzione pre-utf8
echo htmlentities($rs->nome);

// Ecco come deve essere modificata la chiamata alla funzione
echo htmlspecialchars($rs->nome);

Questa operazione è molto più semplice da fare e con l’opportuna accortezza potrebbe richiedere non più di qualche minuto di lavoro; per prima cosa è necessario aprire il progetto nel proprio editor di testi, lanciare una ricerca globale in tutti i files del progetto della stringa “htmlentities(” e sostituirla con “htmlspecialchars(“.

Note conclusive

Completata la conversione del database e dell’applicazione è necessario assicurarsi che tutte le pagine facciano uso del charset UTF-8; volendo si può lanciare un iconv per ciascun documento HTML o PHP del proprio progetto ricordandosi però di impostare nel proprio editor di test il charset UTF-8 come codifica principale di lavoro. E’ infine fondamentale ricordarsi di sostiture il meta-tag Content-type come descritto nella sezione “Conversione di contenuti statici”.


Responses closed, but you can trackback.
Tags: , , , ,

Browse Timeline


Comments are closed.


© Copyright 2009 EXIT4web.net di Bigon Luca
    Via Tozzi, 7 - 36020 Pove del Grappa (VI) - Ph. 392.8613907  Fx. 0424 279931  eM. info@exit4web.net  pIVA. 03161050244