per prima cosa ... html_entity_decode non fa la codifica ma la decodifica, ovvero portà una entità html nei rispettivi byte di conseguenza è normale che non ti codifichi nulla.
per quanto riguarda il mio penultimo post: è compongono per esempio una lettera accentata, mettiamo la à (solo per fare un esempio)
E' sbagliato dire che le stringhe di php sono formate di "caratteri" perché un carattere varia di dimensione in base al contesto, in un formato unicode ogni "carattere" è composto da 2 byte ... in formato utf8 ogni carattere è composto da almeno un byte e può arrivare fino a 4 ... in utf16 da 2 byte a 4 e cosi via.
Quindi se estrai una stringa in utf8 la vedrai correttamente visualizzata nel browser perché ovviamente quest'ultimo vede arrivarsi questi 2 byte, sa che la codifica è UTF8 e quindi li interpreta come il carattere à, ma PHP, che non fa distinzione, perché non ha il concetto di carattere ma solo di byte o insieme di byte (stringa) fa casini effettuando tagli ...
se tu metti una stringa "àbc" in UTF8 estratta dal database e gli dici di fare un strlen non restituirà 3 ma 4, perché la stringa è composta di 3 caratteri ma 4 byte (per via del primo carattere composto da 2 byte) ... se fai un substr($stringa, 1) tu vedrai come primo carattere uno strano risultato
ovviamente se prendi e dentro php stesso fai la prova funzionerà tutto perché la à viene scritta sul disco in formato latin1 (o iso-xxxx-1/15 o cp1250/cp1252 che sono più o meno uguali) e quindi, essendo mono byte, tu la vedrai tagliata correttamente
codice:
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("test");
echo 'Codifica corrente: ' . mysql_client_encoding() . '
';
mysql_set_charset('utf8');
echo 'Nuova codifica: ' . mysql_client_encoding() . '
';
echo '
';
$query = mysql_query("SELECT stringa FROM test");
while($row = mysql_fetch_object($query))
{
echo strlen($row->stringa) . ' - ' . $row->stringa . '
';
}
mysql_close();
?>
con questo codice d'esempio, dove dico di mantenere tutto in utf8 e di non convertire nulla quando arriva la roba a php esce fuori
codice:
Codifica corrente: latin1
Nuova codifica: utf8
10 - à èìòù
4 - Ã bc
ho dovuto forzare la cosa perché php, di default, setta il charset latin1 e quindi ti mangia della roba 
PS: ovviamente la tabella test, in questo caso, deve avere la collation/charset su utf8