Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 36
  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445

    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 21:30

  2. #2

  3. #3
    ottimo

    (si possono fare topic del genere? ne faccio un po' se si può)
    Questa volta, più che un voto.. è favoreggiamento.

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Certo che si può, basta che si parli di PHP...

  5. #5
    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

  6. #6
    peccato che non lo leggerà nessuno di quelli che avranno questo problema specifico sapremo cosa linkare nelle risposte :F

    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Infatti l'ho scritto per poi mettermelo in firma e fare prima a linkarlo

  8. #8
    Bravo, Alhazred

  9. #9
    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?
    Ultima modifica di giannino1995; 20-01-2015 a 23:31
    Più pratica in futuro...

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    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.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.