0

estoy teniendo un problema en la decodificacion de caracteres en PHP actualmente, estoy llamando a un API mediante un file_get_contents() y posteriormente llamando con una variable:

            $jsondata = file_get_contents(URL DEL API);
            $data = json_decode($jsondata, true, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);

Pero al hacer el decode todos los caracteres que llevan tilde tienen un caracter extraño... ya intente haciendo encode y posteriormente un decode con utf8 (ya me habia resultado esto en otros php sin el file_get_contents()):

            $data = json_encode($jsondata, true, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);    
            $data2 = utf8_decode($data);

Y me sale este error:

 Warning:  Illegal string offset 'actions' in /var/www/html/psu/public/json/zjson.php on line 30
 Warning:  Invalid argument supplied for foreach() in /var/www/html/psu/public/json/zjson.php on line 30

Hay alguna forma de convertir estos datos a utf-8 y poder guardarlos en ese formato en mi base de datos?

Samuel
  • 3
  • 3
  • Tienes configurada la BD para que los campos acepten utf-8 ? – EduBw Nov 09 '18 at 12:45
  • Si, como dije anteriormente tengo otros PHP donde hace lo que expuse en la segunda estrofa – Samuel Nov 09 '18 at 12:47
  • Te doy la bienvenida. ¿El problema es cuando recibes los datos desde la API o es al guardarlos en la base de datos? Evita tantas conversiones a medio camino. ¿Probaste un `$data = json_encode($jsondata);` sencillamente, sacando luego por pantalla (para depurar) el contenido por ejemplo con `print_r($data);`? Trabaja la codificación a nivel de configuración: del HTML (encabezados), de PHP, de la base de datos... y nada más. – A. Cedano Nov 09 '18 at 14:32
  • En la API me funciona correctamente ya que al abrir el API directamente en mi navegador me muestra las tildes, al hacer un json_encode me muestra caracteres como "\u00f3\" con el print_r , la idea es que me muestre las letras con tildes – Samuel Nov 09 '18 at 15:06

1 Answers1

0

Despues de tanto buscar y buscar encontre la solucion, con esto fuerzo la codificacion en utf-8 despues de la query:

$result = mysql_set_charset('utf8', $conexion);
$result = mysql_query("SET NAMES utf-8");
Samuel
  • 3
  • 3
  • Es a lo que me refería al decirte: *Trabaja la codificación a nivel de configuración: del HTML (encabezados), de PHP, de la base de datos... y nada más.* Además, esos dos comandos hacen lo mismo, con uno solo basta. Ponerlos los dos es redundante. Los problemas de codificación hay que resolverlos de raíz, no a medias. Además, me parece que ahí te quedas un poco corto, porque aplicas el charset **sólo a ese resultado**, pudiéndolo hacer a la conexión misma, para que se aplique a cualquier resultado. Para más detalles puedes consultar [esta respuesta](https://es.stackoverflow.com/a/59510/29967) – A. Cedano Nov 09 '18 at 19:33