Le pagine HTML codificate in UTF-8 mostrano (punti interrogativi) al posto dei caratteri

Ho l'installazione standard di XAMPP su win7 (x64). Avendo avuto la mia parte di problemi di codifica in un progetto passato in cui la codifica mysql non corrispondeva alla codifica php che a sua volta a volte generava l'html in altre codifiche, decisi di codificare coerentemente tutto usando utf-8.

Sono appena iniziato con il markup html e sto già vivendo problemi.

  • La mia pagina viene salvata usando utf-8 (no distinta base, penso )
    // aggiornamento: risulta che NON era il caso. Il file è stato effettivamente salvato con ISO_8859-1 . Più tardi l'ho scoperto grazie alla risposta di Sherm Pendleys. Ho dovuto tornare indietro e modificare le impostazioni del mio progetto (impostate su "ISO-8859-1") sul desiderato "UTF-8".
  • php è impostato per .htaccess per servire pagine .php in utf-8 con: AddCharset UTF-8 .php
  • html ha un meta tag che specifica: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • Per testare ho impostato l' header('Content-Type:text/html; charset=UTF-8'); php usata header('Content-Type:text/html; charset=UTF-8');

La pagina è evidentemente pubblicata in utf-8 (Firefox e Chrome lo riconoscono come tale) ma qualsiasi carattere speciale come é , á o ¡ verrà mostrato come . Anche durante la visualizzazione del codice sorgente.

Quando si rilasciano le impostazioni di codifica menzionate sopra, tutti i caratteri vengono visualizzati correttamente, ma la codifica rilevata mostra windows-1252 o ISO-8859-1 seconda del browser.

Come mai? Sono molto perplesso. Mi sarei aspettato il comportmento esattamente opposto.
Qualche consiglio è benvenuto, grazie!

edit: Speriamo che questo aiuti un po 'di più. Questa è l'intestazione della risposta (come da firebug)

 HTTP/1.1 200 OK Date: Sat, 26 Mar 2011 20:49:44 GMT Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By: PHP/5.3.1 Content-Length: 91 Keep-Alive: timeout=5, max=99 Connection: Keep-Alive Content-Type: text/html; charset=utf-8 

Quando [dropping] le impostazioni di codifica menzionate sopra tutti i caratteri [sono renderizzati] correttamente ma la codifica rilevata mostra windows-1252 o ISO-8859-1 a seconda del browser.

Allora è quello che stai davvero inviando. Nessuna delle impostazioni di codifica nel tuo elenco di elenchi effettivamente modificherà l'output in alcun modo; tutto ciò che fanno è dire al browser quale codifica assumere quando si interpreta ciò che si invia. È per questo che stai ricevendo queste informazioni: stai dicendo al browser che ciò che stai inviando è UTF-8, ma in realtà è ISO-8859-1.

Nel mio caso, il database ha restituito latin1 , quando il mio browser si aspettava utf8 .

Quindi per MySQLi ho fatto:

  mysqli_set_charset($dblink, "utf8"); 

Vedi http://php.net/manual/en/mysqli.set-charset.php per maggiori informazioni

Controlla se qualcuno dei tuoi file .php che sta printingndo del text, è anche in grado di codificare correttamente in utf-8 .

Dì a DOP il tuo charset inizialmente …. qualcosa del genere

 PDO("mysql:host=$host;dbname=$DB_name;charset=utf8;", $username, $password); 

Notare: charset=utf8; parte.

spero che sia d'aiuto!

Vengo dal Brasile e creo le mie basi di dati usando latin1_spanish_ci . Per l'html e tutto il resto uso:

 charset=ISO-8859-1 

I dati vanno bene con é , ã e ç … A volte devo mettere i testi del codice html usando il codice di esso, come ad esempio:

 Ol&aacute; 

mi da

 Olá 

Puoi trovare i codici in questa pagina: http://www.ascii.cl/htmlcodes.htm

Spero che questo ti aiuti. Ricordo che era DAVVERO fastidioso.

Il problema è il charset che viene utilizzato da apache per servire le pagine. Lavoro con Linux, quindi non so nulla di XAMPP. Ho avuto lo stesso problema, quello che ho fatto per risolvere il problema è stato aggiungere il charset al file di configuration charset (è commentato per impostazione predefinita).

Nel mio caso ce l'ho in /etc/apache2/conf.d/charset ma, dal momento che stai usando Windows, la posizione è diversa. Quindi ti sto dando un'idea di come risolverlo.

Alla fine, il mio file di configuration charset è simile al seguente:

 # Read the documentation before enabling AddDefaultCharset. # In general, it is only a good idea if you know that all your files # have this encoding. It will override any encoding given in the files # in meta http-equiv or xml encoding tags. AddDefaultCharset UTF-8 

Spero possa essere d'aiuto.

Sembra che nessuno abbia menzionato

 SET NAMES utf8; 

Ho trovato questa soluzione qui e mi ha aiutato. Come applicarlo:

Per essere tutti UTF-8, emettere la seguente dichiarazione subito dopo aver effettuato la connessione al server del database: SET NAMES utf8;

Forse questo aiuterà qualcuno.