Originariamente inviato da daniele_dll
beh ... basta sputar fuori un bel

header('Content-Type: text/html; encoding=UTF8');
La pagina non è mai in utf8 a meno che non sia già stata codificata.
Tutto ciò che si manda in output senza codifiche con php viene inviato nella codifica settata dalla variabile internal_encoding che si può settare sul php.ini (di default ISO-8859-15 se non sbaglio)
Ne deriva che tutto ciò che ha codifiche differenti va sempre codificato prima di andare in output.
Se non prelevi dati da altre fonti ti conviene codificare tutto con l'handler di mb_string per i buffer.
In questo modo la funzione handler applica l'header corretto al documento e codifica correttamente tutto il documento.

X lilo

I punti di domanda sono caratteri non rappresentabili nel charset impostato per il documento.
Per farti un esempio spiantato ma che rende l'idea.

Supponiamo di aver indicato il charset VOCALI (non esiste naturalmente) e mandiamo in output questa frase.

Ciao questo è un esempio

il risultato sarà

?iao ?ue??o ? u? e?s??io

Perchè il charset VOCALI non prevede le consonanti e il punto di domanda sta a significare proprio "Ma che cavolo di carattere è questo?!?"

Questo è un tipo di errore classico quando si utilizza un charset non adatto alla propria lingua.
Per esempio l'italiano ha le lettere accentate ma il charset non le prevede.
L'esempio del simbolo dell'euro è un altro caso. Il simbolo è previsto infatti in ISO-8859-15 ma non in ISO-8859-1.
Se imposti il charset in ISO-8859-1 e provi a mandare in output il simbolo dell'euro vedrai un bel punto di domanda

Se cambi charset e utilizzi ISO-8859-15 vedrai che il simbolo compare correttamente.

Un altro tipo di errore consiste nell'inviare caratteri con un encoding diverso da quello previsto nel documento. Questo può originare punti di domanda, caratteri multipli, caratteri assurdi, caratteri assurdi e multipli

L'importante è individuare il carattere giusto per la pagina. Se c'è solo contenuto in italiano l'iso-8859-15 andrà benissimo. Se invece la pagina avrà contenuti multuilingua allora la cosa migliore da fare è utilizzare utf8. Una volta individuato l'encoding devi assicurarti di inviare i caratteri correttamente codificati come hai indicato.
Se usi utf-8 devi puoi codificare tutta la pagina prima di andare in output.

N.B. Le funzioni di encoding (anche quelle mb_string) sono piuttosto stupide. Se cerchi di codificare in utf8 del testo che è già in utf8 non ottieni l'effetto che potresti attenderti (cioè lo stesso testo ancora in utf8) ma il tutto sarà nuovamente codificato con effetti imprevisti.