Visualizzazione dei risultati da 1 a 10 su 35

Visualizzazione discussione

  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,805

    Come ovviare al problema dei "caratteri strani" nel db o sulle pagine.

    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
    codice:
    <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.
    Codice PHP:
    //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.
    Ultima modifica di Alhazred; 19-10-2014 a 22:30

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.