Yo me encontre con ese problema alguna vez, y tuve que realizar algunas modificaciones pues estaba un poco desordenado, tenia archivos con codificacion ANSI y otros en UTF-8 y no recuerdo la codofocacion en la BD, creo era utf8_general_ci, y usaba el juego de caracteres ISO-8859-1 en HTML, bueno, la cosa es que lo primero que hice fue codifocar todos los archivos a UTF-8 y usar el mismo juego de caracteres en HTML y, para estar seguro, tambien en PHP en los encabezados "Content-Type: [
text/html|
text/javascript|
etc.]; charset=UTF-8'", con eso solucionaba que me aparecieran caracteres como "ñ" o el rombo, pero no al guardar o extraer los datos en la BD, para eso tuve que codificar los datos antes de guardar y despues de extraer con utf8_decode/encode por medio de una funcion:
Código PHP:
<?php
function utf8_($modo, &$datos, $return = false){
$codificar = function($datos, $modo, $codificar){
if(!is_array($datos)){
$datos = $modo == 'encode' ? utf8_encode($datos) : utf8_decode($datos);
}
else{
foreach($datos as $ind => $val){
$datos[$ind] = $codificar($val, $modo, $codificar);
}
}
return $datos;
};
if($return){
return $codificar($datos, $modo, $codificar);
}
$datos = $codificar($datos, $modo, $codificar);
}
?>
Asi solo queda hacer:
Código PHP:
<?pnp
$datos = $_POST['datos'];
// manejar datos antes de guardarlos
utf8_('decode', $datos);
// guardar datos
?>
Yo en lo personal uso una sola variable para los campos de un formulario, asi solo tendria que paras una sola vez la funcion.
Ahora para extraer:
Código PHP:
<?php
// llamada sql
while($datos = MANEJADOR){
utf8_('encode', $datos);
// hacer algo
}
?>
Bueno asi resolvi ese problema y hoy lo sigo usando. Espero esto te sea de utilidad.
Saludos!