Pues parece ser que era justo eso, la base de datos no está en UTF-8
Estuve buscando varias formas de pasarlo, desde modificar la consulta SQL para que retornara los valores ya codificados a utf-8, varias funciones que lo hacían, y finalmente encontré esta solución:
Código PHP:
function utf8_encode_deep(&$input) {
if (is_string($input)) {
$input = utf8_encode($input);
} else if (is_array($input)) {
foreach ($input as &$value) {
utf8_encode_deep($value);
}
unset($value);
} else if (is_object($input)) {
$vars = array_keys(get_object_vars($input));
foreach ($vars as $var) {
utf8_encode_deep($input->$var);
}
}
}
La verdad, si lo hubiera pensado detenidamente, hubiera podido hacerla yo mismo, pero estaba cegado buscando la manera de que SQL devolviera los valores directamente con CAST o CONVERT, pero no lo conseguía.
Gracias por la idea Triby, desconocía que json_encode sólo funcionaba con UTF-8