Buongiorno.
Ho un problema che credo chiunque non sia un principiante come me abbia già incontrato.
ho difficoltà con la codifica utf8 dei dati scritti nel database, probabilmente per un'impostazione sbagliata, o qualcosa da aggiungere o nel codice PDO o nel database stesso, ma non riesco a risolvere.
Ho settato la codifica del database a utf8_general_ci, così come la codifica delle tabella e degli attributi di testo, ed eseguendo la seguente query:
show variables like 'char%';
ottengo:
character_set_client 		utf8mb4
character_set_connection 	utf8mb4
character_set_database 		utf8
character_set_filesystem 	binary
character_set_results 		utf8mb4
character_set_server 		latin1
character_set_system 		utf8
character_sets_dir 			C:\Users\Benny\Documents\SOFTWARE\XAMPP\mysql\shar...
Per quanto riguarda la connessione PDO al database, questo è il codice:
private function db_conn() {
        //connect to database 'PDO'
        try {
            $server ="mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8";
            $con = new PDO($server,DB_USER,DB_PASSWORD);
            $con->exec("set names utf8");
        } catch (PDOException $e) {
            if ($_SERVER['HTTP_HOST'] == 'localhost') {
                die($e->getMessage());
            }else {
                die("could not connect to the database");
            }
        }
        return $con;
    }
DB_NAME, DB_HOST, eccetera sono definiti in un file di configurazione (che qui non serve, perché la connessione avviene sempre in modo corretto).
Il problema è che se io inserisco del testo in alcune form e tramite una query lo scrivo sul DB, i caratteri speciali tipo è,ò,ù mutano in ù,ì,ò… Ho provato alcune altre impostazioni, tipo inserire l'istruzione che segue prima del try-catch:
header('Content-type: text/html;charset=utf-8');
senza successo.
Una soluzione potrebbe essere quella di correggere i dati in input dal DB con un'apposita function, tipo:
function my_htmlchar($var)
{
	$search = array('ì', 'è', 'é', 'ò', 'à', 'ù');
	$replace = array('ì', 'è', 'é', 'ò', 'à', 'ù');
	
	$var = str_replace($search, $replace, $var);
	
	return $var;
}
ma non so se funziona, e se poi copra tutti i caratteri errati.
Qualcuno ha una soluzione da propormi?