PHP: codifica UTF-8 senza BOM

Oggi vediamo come risolvere quelle spiacevoli sorprese “visive” e peggio ancora “funzionali” ai nostri file PHP.

Molto probabilmente se siete su questa pagina vi sarà successo di trovare mal funzionamenti sulla vostra pagina web, ad esempio problemi del tipo:

– viene visualizzato dello spazio all’inizio della pagina
– qualche HEADER che non funziona
– session_start() non funziona
– ecc…

Questo perchè il file che avete scritto è stato salvato con una codifica errata, anche sè nella vostra pagina avete impostato:

<meta charset=”utf-8″ />

Purtroppo la codifica gioca questi brutti scherzetti, e si diventa matti a cercare un problema che nel listato risulta invisibile.

Per risolvere questo problema basta convertire il file in UTF-8 senza BOM e rispettivamente salvarlo in UTF-8 senza BOM (i successivi file che andrete a scrivere, non c’è bisogno di convertirli, basta salvarli direttamente con la suddetta codifica) e questa semplice procedura potrete eseguirla tramite l’editor di testo che usate per scrivere i file in PHP, se il vostro editor non prevede questa funzione, basta usare ad esempio editor come notepad++ che ce l’hanno.

Per quanto riguarda i database e le rispettive tabelle bisogna usare rispettivamente:
character set utf8 e collation utf8_general_ci

Così potrete inserire del testo all’interno delle tabelle, utilizzando i caratteri così come sono senza utilizzare le rispettive entità e, prima di lanciare una query c’è un piccolo accorgimento da prendere subito dopo aver stabilito la connessione con il database e cioè, eseguire questa query:

mysql_query(“SET NAMES ‘utf8′”, $conn);

Quando invece poi dovrete estrarre i dati basta utilizzare questa funzione:

htmlentities($stringa, ENT_QUOTES, “UTF-8”)

Una piccola raccomandazione ma molto importante che voglio lasciare in questo articolo è quella di filtrare sempre i dati prima di caricarli sul database, per evitare di incorrere in spiacevoli sorprese da parte di malintenzionati, ma anche semplicemente da parte di un normalissimo commento lasciato da un tranquillo utente.
Ci sono funzioni come mysql_real_escape_string(), strip_tags() ecc… che servono proprio a questo.

Maggiori info su:

htmlentities()
mysql_real_escape_string()
strip_tags()
BOM