Después de tantos dolores de cabeza por tener un problema similar, llegue a la siguiente conclusión que me ha funcionando sin ningún problema:
- Cotejamiento de la BDs: latin1_swedish_ci
- Codificacion en el meta (charset): utf-8
- Al guardar en la base de datos usar la función: utf8_decode($cadena)
- Al mostrar algún valor utilizar: utf8_encode($cadena)
el htmlentities no lo utilizo ya que en lugar de guardar los caracteres especiales reemplaza a su equivalente HTML, intenta probar esta combinación y me dices que resulto.
Nota: si intentas con las mayúsculas y minúsculas te recomiendo que conviertas antes de guardar en la base de datos.