2

En el proyecto en el cual estoy trabajando realizo una consulta a la base de datos y esta me arroja toda la información que necesito para poder cargar la sesión, sin embargo, en la base de datos se alojan cadenas las cuales contienen acentos entonces al recibirlas en mi API hecha en PHP al momento de querer formar el JSON los acentos los detecta como caracteres extraños. Se que existe una función que es utf8_decode pero solo sirve para cadenas simples y me avisa que esperaba una cadena y no un array. Agradecería de todo corazón si alguien me explicara de que manera puedo hacer que en mi JSON no detecte los acentos como caracteres extraños. Como información adicional la base de datos esta creada con el charset ISO-8859-1 y la conexión a la base de datos es mediante PDO. de antemano muchas gracias. Aquí una parte del código de PHP

<?php 
include('conexion.php');

$userPass = $_POST['userPass'];
$userMail = $_POST['userMail'];

$data = array();
$hashed = hash('sha512', $userPass);

$consulta = 'CALL PA_SeleccionarCuenta(?, ?)';

$stmt = $conn->prepare($consulta);

$stmt->bindParam(1, $userMail, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(2, $hashed, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT);

if ($stmt->execute()){
    while ($datos = $stmt->fetchAll(PDO::FETCH_ASSOC)){
        $data['datos'] = $datos;
    }
}

$json = json_encode($data);

echo $json; ?>
  • Creo que lo puedes resolver de forma simple con `json_encode($data, JSON_UNESCAPED_UNICODE);`, para mas información puedes revisar [PHP json_decode](http://se2.php.net/json_encode) – the-breaker Aug 07 '19 at 20:00

1 Answers1

2

En esta línea:

$json = json_encode($data);

Agrega como segundo parámetro la constante predefinida de PHP: JSON_UNESCAPED_UNICODE de este modo:

$json = json_encode($data, JSON_UNESCAPED_UNICODE);

La cual de acuerdo a la documentación de PHP, sirve para:

Codificar caracteres Unicode multibyte literalmente (por defecto es escapado como \uXXXX). Disponible desde PHP 5.4.0.

Hace uso de Unicode ya que esta es la manera estandarizada de representación de cadenas de caracteres para el soporte entre múltiples idiomas

Mas sobre Unicode

BetaM
  • 30,571
  • 7
  • 32
  • 50
  • Si busqué en distintos foros y en las mismas preguntas de esta plataforma, pero por alguna razón utilizar `JSON_UNESCAPED_UNICODE` no funciona para mi, sigo recibiendo los acentos con el símbolo que es un signo de interrogación en medio de un rombo ">" – Iván Guzmán Aug 08 '19 at 15:54
  • deberás revisar entonces: 1.- Colación en la base de datos, 2.- Uso de UTF-8 en tu página web @IvánGuzmán pues probé esto cuando te respondí y funciona sin problemas, entonces tal vez el problema venga desde la BD – BetaM Aug 08 '19 at 15:56
  • @IvánGuzmán revisa esta respuesta puede ayudarte a encontrar rápido el error: https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base/59510#59510 – BetaM Aug 08 '19 at 15:57
  • Ahora que lo menciones hice algunas configuraciones en mi base de datos para que pudiera aceptar acentos debido a que la información tiene que ser exacta debido a que es un proyecto para el gobierno del estado donde vivo, lo que hice fue que al momento de crear la base de datos seleccione el conjunto de caracteres ISO-8859-1 porque tengo entendido que UTF-8 no acepta caracteres especiales – Iván Guzmán Aug 08 '19 at 16:20
  • yo he usando utf8 con acentos sin problemas, deberías hacer la prueba @IvánGuzmán o si tu mysql es reciente 5.7 u 8 probar con utf8mb4 – BetaM Aug 08 '19 at 16:23
  • 1
    Oh acabo de darme cuenta que UTF-8 también trabaja con acentos, no se por que tenia esa idea, te agradezco por tu ayuda! cambie el cotejamiento de la base de datos de latin1 a utf8-spanish y recibo los datos correctamente – Iván Guzmán Aug 08 '19 at 16:35