Il problema è di duplice natura. Da un lato, volendo tradurre i caratteri "strani" in entità, serivrebbe un linguaggio lato server come PHP, che ha funzioni create apposta per questo:
codice:
$testo = htmlentities($testo,ENT_QUOTES); /* Funzione di PHP che converte tutti i caratteri accentati, gli apici singoli e doppi e i segni < e > nelle corrispondenti entità */
Dall'altro, in realtà, converrebbe mantenere i caratteri così come sono, cambiando semplicemente il character set. Se le pagine usano il charset ISO-8859-1 (alias Latin1), è normale che quei caratteri non vengano interpretati correttamente. Il consiglio è usare per tutti i nuovi siti/blog l'UTF-8 (senza BOM). UTF-8 si basa su Unicode (ormai lo standard per tutti i software, ma ahimé, non per l'interpretazione degli user-agent). Esistono 2 tipi di UTF-8: uno con BOM (Byte Order Mark) e uno senza. E' sempre opportuno salvare i file in UTF-8 SENZA BOM, perché può causare problemi di interpretazione agli user-agent.
UTF-8 può rappresentare milioni di caratteri senza bisogno di ricorrere alle rispettive entità.
Per usarlo però bisogna seguire obbligatoriamente tutti questi passaggi:
1. Indicare come charset nel meta tag "Content-Type" UTF-8 (anche minuscolo, è indifferente).
2. Salvare il file nella codifica UTF-8 (senza BOM). Questo è FONDAMENTALE, altrimenti sarà interpretato ugualmente secondo gli headers HTTP inviati dal server (in genere ISO-8859-1). L'opzione di salvataggio dipende dall'editor che si utilizza, ma un buon editor DEVE permettere il salvataggio dei file di testo in UTF-8 senza BOM.
3. Per le pagine generate da PHP (o altri linguaggi server-side), forzare l'header "Content-Type" ad essere UTF-8.
In questo modo, è possibile scrivere tutti i caratteri così come appaiono, ad eccezione dei segni < e > (che diventano rispettivamente & lt; e & gt; senza spazio dopo la &). Tramite PHP sarà comunque possibile convertire gli apici singoli e doppi, usando la funzione htmlspecialchars() che funziona esattamente come htmlentities() ma converte solo: <, >, ' e " (gli apici sono convertiti solo se si passa il secondo argomento come ENT_QUOTES).
Va ricordato che anche il database e le singole tabelle vanno impostati con:
character set utf8
collation utf8_general_ci
Quando si inserisce o si modifica il testo nei campi di una tabella, è sufficiente inserirlo normalmente, con lettere accentate e tutto il resto. Quando una pagina PHP legge il testo dal database, dovrà usare htmlspecialchars($testo,ENT_NOQUOTES,'UTF-8') in modo da
convertire i caratteri < e > in & lt; e & gt; e lasciare gli apici inalterati, usando come codifica UTF-8 (di default htmlspecialchars() usa ISO-8859-1).
I form ereditano il set di caratteri specificato per la pagina, quindi non necessitano di particolari accorgimenti.
L'uso di UTF-8 è consigliato per tutti i siti visto che supporta praticamente tutti i tipi di carattere. Può dare parecchi grattacapi all'inizio, ma implementarlo significa risparmiarsi un sacco di problemi dopo!