Per evitare incasinamenti (anche se qui non è quello il problema) usa soltanto una funzione di encode ed una di decode, di fatto htmlentities e htmlspecialchars fanno la stessa cosa, cambia solo a quanti caratteri applicano la conversione, se vuoi farla su tutti usa la prima, altrimenti usa la seconda.

Questo codice però funziona correttamente, quindi penso che il problema possa essere durante l'inserimento/recupero dei dati dal db.
Puoi postarci anche quelle due porzioni di codice?