Pagina 1 di 1

[MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?"

MessaggioInviato: mar giu 15, 2010 1:37 pm
da M@ttia
Sto attualmente scrivendo un'applicazione web in PHP che, fra le varie cose, va anche a leggere delle stringhe di testo in un database MySQL per poi stamparle a schermo col classico comando echo. Tuttavia non riesco a leggere correttamente delle stringhe di testo che contengono dei caratteri accentati quali à è oppure lettere tedesche come ü, ö, ...

Dal punto di vista della pagina web (in XHTML 1.0 Strict), la dichiarazione del charset è:
Codice: Seleziona tutto
<meta http-equiv= "Content-Type"  content= "text/html;  charset=iso-8859-1" />

e se vado a scrivere "già" direttamente nel <body> nel codice html viene visualizzato correttamente.

Dal punto di vista del database MySQL, la stringa la estrapolo da una tabella, dalla colonna "TextMessage" che è dichiarata come latin1_german1_ci (ma anche come utf8_unicode_ci o altri dopo non funziona), e se vado ad aprire il database MySQL online con PhpMyAdmin, quando visualizzo il contenuto della tabella la stringa è visualizzata correttamente con le "à"!!!

Quando però nella mia pagina eseguo una query del tipo
Codice: Seleziona tutto
$query = "SELECT TextMessage FROM MiaTabella;
...
echo $Stringa;

tutte le stringhe che contengono lettere accentate, ecc. vengono rimpiazzate dal solito generico simbolo "?". Non riesco proprio a venirne a capo, in quanto scrivendo direttamente della pagina funziona, leggendo il contenuto del database da PhpmyAdmin funziona, ma leggendole da php no: qualcuno può aiutarmi a risolvere il dilemma??? [XX(]

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mar giu 15, 2010 2:04 pm
da ste_95

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mar giu 15, 2010 2:22 pm
da M@ttia
Uhm, ti ringrazio!
Dei due, hmtlentities è quello mi risolve il problema, ma me ne crea un altro. [:)] La mia stringa è del tipo "Oggi <i>abbiamo</i> già visto che...", ovvero contiene anche semplice codice html per il grassetto, corsivo o sottolineato, e questo così facendo non viene più interpretato come html, ma appunto stampato a schermo come <i> (poiché le < > sono rimpiazzate dal codice html). Potrei ev. risolvere inventandomi un tag per il corsivo e poi facendo sostituire a php con strreplace dopo hmtlentities, ma se ti viene in mente qualcosa di meno grezzo... [^]


Edit:
Come non detto: esiste la funzione htmlspecialchars che si occupa solo dei simboli html < > % ' ", quindi il risultato da me voluto lo ottengo tramite:

Codice: Seleziona tutto
htmlspecialchars_decode(htmlentities($Stringa]));


Un po' machiavellico ma funziona! Grazie per l'aiuto [^]

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mar giu 15, 2010 2:32 pm
da ste_95
Figurati!

[ciao]

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mer giu 30, 2010 9:58 am
da Zane
Sono impazzito (e, tutt'ora, impazzisco quotidianamente!) anch'io dietro a questo maledetto problema. La soluzione che ti consiglio è:

1) Usare le accentate normali

2) Usare campi utf8_bin nel DB

3) Cambiare il charset HTML in
Codice: Seleziona tutto
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


Attento soltanto che dopo devi farti una scorpacciata di articoli come questo... ma in questo modo, si dovrebbe risolvere tutto al meglio (ed è anche il modo più efficace per scrivere il nome della sede principale di Sharp usando i caratteri giusti) yyy

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mer giu 30, 2010 10:34 am
da ste_95
Sto tribolando anch'io di recente con questo problema... ho un file che chiama un metodo di una classe che estrae dei dati dal database e ne crea un array.
Problemi:
- se faccio l'htmlentities dalla classe di ogni indice, nella chiamata al metodo tornano caratteri strani, mentre se mi faccio stampare la stringa htmlentities-zzata dal metodo tutto si vede bene.
- devo fare l'htmlentities dal file e non dalla classe, che è un po' scomodo.

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mer giu 30, 2010 12:35 pm
da Zane
Se hai seguito le mie tre indicazioni precedenti, prova a fare la chiamata come htmlentities($tua_stringa, ENT_COMPAT, 'UTF-8'). Ad ogni modo: seguendo l'approccio che ho indicato, l'entitaggio non dovrebbe più servire.

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mer giu 30, 2010 12:58 pm
da Andy94
In effetti io faccio sempre come dici tu... Codifico in UTF8, tengo i campi in utf8_general_ci e non htmlentitizzo nulla... Entra ed esce regolarmente.

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mer giu 30, 2010 1:15 pm
da eDog
Si, anch'io andavo di utf-8 come codifica di pagina e db..

Quanto mi manca programmare in PHP.. [cry] Dopo due anni di Java.. ora spero proprio di non dover imparare l'ASP a scuola.. [acc2]

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: mer giu 30, 2010 2:31 pm
da ste_95
Zane ha scritto:Ad ogni modo: seguendo l'approccio che ho indicato, l'entitaggio non dovrebbe più servire.

È vero! Grazie! [:)]

Re: [MySQL+PHP] Lettere accentate rimpiazzate dal simbolo "?

MessaggioInviato: dom apr 13, 2014 6:14 pm
da straus
Ragazzi, sono nuovo. Sono capitato per caso in questo argomento facendo una ricerca, ho proprio il problema in questione.

Per visualizzare correttamente in MySql i caratteri accentati, li inserisco Octal es: \350 che equivale a è e nel db si scrivono giusti. Il problema si presenta quando poi li estraggo e li stampo a video e appare il classico punto di domanda.
Nel db ho la codifica latin1_swedish_ci ho provato a sostituire con utf8_bin ma è peggio, nel db si stampano caratteri numerici.

Questo è il codice, la stringa in questione è ".$link['pagina']."

Codice: Seleziona tutto
//Estrae i dati dal DB e crea la sequenza delle pagine più viste 
function piu_visitate($n) {
$mysqli = new mysqli("localhost", "root", "pwd", "gruppoalveo"); 
   $pag_viste = $mysqli->query("SELECT * FROM visitate ORDER BY visite DESC LIMIT 0,$n");
  if ($pag_viste->num_rows > 0) {
    echo "<ol class=\"formol\"'piu_visitate'>";
    while ($link = $pag_viste->fetch_array(MYSQLI_ASSOC)) { 
    echo "<div style=\"margin-bottom:-10px; font-family:verdana; font-size:9px; color:#b3b3b3;\">".$link["visite"]." volte</div>"; 
    echo "<li><a class=\"visti\" href='".$link['url']."'>".$link['pagina']."</a></li>";
    }
  echo "</ol>";
  }
}


Potete darmi una mano?