PDA

Visualizza la versione completa : Come ovviare al problema dei "caratteri strani" nel db o sulle pagine.


Alhazred
18-12-2013, 13:23
Questo post è rivolto a tutte quelle persone che hanno problemi del tipo:
- sulla pagina le lettere accentate appaiono come punti interrogativi o altri caratteri strani
- salvo i dati nel db correttamente, ma poi quando li stampo sulla pagina alcuni caratteri non sono corretti
- nel db le lettere accentate vengono salvate in modo non corretto
- tutte le varianti sul tema "i caratteri non sono salvati/visualizzati correttamente"

Ovviamente, oltre che per le lettere accentate, vale anche per i caratteri delle lingue non latine, quindi anche per le lingue asiatiche, arabe, cirilliche ecc...
Il tutto vale anche se non si fa uso di un database, in tal caso bisogna rendere coerenti solo i charset degli elementi che verranno effettivamente usati.

Il motivo che provoca questo genere di problemi è un errato uso della codifica dei caratteri.
Molti pensano che il tutto sia gestito automaticamente, altri sanno che va gestito, ma non lo gestiscono in tutte le sue parti.
Ogni elemento che viene coinvolto nel processo di visualizzazione o salvataggio del testo deve avere una codifica coerente con gli altri, non si può avere qualcuno che "parla" in UTF8 e qualcuno che "parla" in latin1_swedish_ci, in tali casi i componenti in questione non si capiscono correttamente, esattamente come accade nella vita reale quando dite ad un americano di scrivere "spaghetti" e questo invece vi scrive "spagheti" con una sola t perché non afferra l'uso della doppia.

Fatta questa premessa veniamo al dunque, farò gli esempi usando UTF8, ma nei casi concreti si dovrà usare il charset adatto al caso specifico.

CHARSET del codice html
La pagina su cui va visualizzato il testo o dove va inserito un form su cui scrivere dei dati da inviare deve avere il tag che specifica il charset da usare, ovvero


<head>
<meta charset="utf-8">
....
</head>




Per il database servono due cose, mentre spesso si pensa solo ad una delle due credendo che siano la stessa cosa.

COLLATION del database
Quando si crea un database viene richiesto quale charset usare come collation, quindi bisogna assicurarsi che si stia creando con lo stesso charset che si userà nelle altre parti dell'applicazione.

CHARSET delle tabelle
Oltre a specificare il charset da usare come collation del database, va anche specificato il charset delle singole tabelle al momento della loro creazione.
Anche questo dovrà essere coerente con il charset che si decide di usare per l'applicazione.


Interfacciamento al database
Se ci si deve interfacciare ad un database, PHP deve sapere in quale "lingua" deve parlargli, quindi va specificato anche il charset da usare per la connessione tra PHP e MySQL.
Questa cosa va specificata al momento della connessione al database, subito dopo averlo selezionato.


//per chi ancora usa le istruzioni mysql_
mysql_set_charset("utf8");

//per chi usa le istruzioni mysqli_
//versione object oriented
$mysqli->set_charset("utf8");

//versione procedurale, $link è il link della connessione al database
mysqli_set_charset($link, "utf8");

//per chi usa PDO il charset può essere specificato nella stringa di connessione
//a seconda della versione di MySQL però si possono avere dei problemi
//un altro modo per specificare il charset è questo
$dbh = new PDO("mysql:$connstr", $user, $password);
$dbh->exec("set names utf8");




Infine la cosa a cui mai nessuno pensa.

Anche i file hanno un charset!
Anche ai file è associato un charset, quindi bisogna stare attenti che sia lo stesso che si andrà ad usare per il resto dell'applicazione.
Quando si salva un file .php o .html bisogna assicurarsi che lo si faccia usando il charset adeguato.
Molti editor di testo offrono la possibilità di salvare i file in un charset specifico, personalmente uso Notepad++ (gratuito e liberamente scaricabile).
Con Notepad++ all'apertura di un file o alla creazione di uno nuovo, in basso a destra viene mostrato il charset del file in questione.
Continuando a parlare di UTF8, bisogna assicurarsi che sia indicato "ANSI as UTF8" o nelle versioni più nuove "UTF-8 w/o BOM", se non lo fosse bisogna convertire il file e lo si può fare dallo stesso Notepad++ andando nel menu "Formato" e selezionando la voce "Converti in UTF8 senza BOM".
"ANSI as UTF8" ed "UTF8 senza BOM" sono sinonimi.
Esiste anche il formato UTF8 semplice, ma non va usato poiché all'inizio del file applica un carattere non stampabile (quindi invisibile, ma c'è!) che farà saltare l'eventuale uso di session_start(), header() o altre funzioni che richiedono che non ci sia altro output prima della loro esecuzione.


Questo è quanto serve sapere per un corretto uso dei charset e non ritrovarsi con caratteri strani da qualche parte.

fdisotto
18-12-2013, 17:38
+1
Ottimo post.

Al_katraz984
18-12-2013, 19:08
ottimo :)

(si possono fare topic del genere? ne faccio un po' se si può)

Alhazred
18-12-2013, 20:04
Certo che si può, basta che si parli di PHP... ;)

micdas
19-12-2013, 10:55
Un grazie ad Alhazred per questo post.
Se posso permettermi un suggerimento, per non perderlo in mezzo agli altri post, sarebbe da metterlo in evidenza e/o aggiungerlo tra le pillole se già non c'è.

Grazie ancora :ciauz:

Santino83_02
19-12-2013, 11:59
peccato che non lo leggerà nessuno di quelli che avranno questo problema specifico :( sapremo cosa linkare nelle risposte :F

:ciauz:

Alhazred
19-12-2013, 12:12
Infatti l'ho scritto per poi mettermelo in firma e fare prima a linkarlo :D

micdas
19-12-2013, 15:35
Bravo, Alhazred ;)

giannino1995
20-01-2015, 23:26
Nel mio libro si parlava anche di questo ma non in modo organico come hai fatto te, molto interessante, bravo. L'unica cosa che si dimenticava di dire è relativo al carset dei file e l'ho imparato a mie spese qualche mese dopo!! :)

Se posso però ho ancora delle piccole domande da farti. Perché nel file html c'è un trattino? E' una distrazzione/convenzione/inesattezza oppure il codice html usa il trattino per chiamare l'utf8? E' ancora così per l'html5? Scrivere UTF o utf è la stessa cosa? posso anche scrivere UtF giusto?

Alhazred
20-01-2015, 23:36
Si scrive col trattino e l'attributo "charset" è proprio di HTML 5, prima era... basta cercare
http://www.w3schools.com/tags/att_meta_charset.asp

Se hai altre domande specifiche a riguardo, puoi chiedere nella sezione HTML.

Loading