Saltar al contenido

¿Por qué esta llamada de PHP a json_encode falla silenciosamente: incapacidad para manejar comillas simples?

Investigamos en distintos sitios para así brindarte la respuesta a tu inquietud, en caso de inquietudes déjanos la pregunta y te respondemos con gusto, porque estamos para ayudarte.

Solución:

Debe establecer la codificación de conexión antes de ejecutar consultas. Cómo se hace esto depende de la API que esté utilizando para conectarse:

  • llamar mysql_set_charset("utf8") si usa la API antigua y obsoleta.
  • llamar mysqli_set_charset("utf8") si usas mysqli
  • añade el charset parámetro a la conexión string si usa PDO y PHP> = 5.3.6. En versiones anteriores es necesario ejecutar SET NAMES utf8.

Cuando obtenga datos de MySQL, cualquier texto se codificará en “codificación de cliente”, que probablemente sea Windows-1252 si no lo configura de otra manera. El carácter que está causando su problema es la “comilla rizada”, vista como 92 en el volcado hexadecimal, que confirma que el cliente mysql está codificando texto en windows-1252.

Otra cosa que podría considerar es pasar todo el texto a través de utf8_encode, pero en este caso no produciría el resultado correcto. PHP utf8_encode convierte iso-8859-1-texto codificado. En esta codificación, x92 es un carácter de control no imprimible, que se convertiría en un carácter de control no imprimible en utf-8. podrías usar str_replace("x92", "'", $input) para solucionar el problema de este carácter en particular, pero si hay alguna posibilidad de que haya otros caracteres que no sean ascii en la base de datos, querrá que el cliente use UTF-8.

Lo que tuve que hacer en el pasado para json_encode en texto con caracteres utf8 es

json_encode( utf8_encode( $s ) );

y en algunos casos

json_encode( htmlspecialchars( utf8_encode( $s ) ) );

el utf8_encode() para manejar caracteres especiales (nota, eso es Encode, no Decode)

el htmlspecialchars() dependiendo de cómo quieras usar el JSON stringes posible que pueda omitir esto

y finalmente, json_encode() para obtener su paquete JSON.

Dado que desea json_encode un objeto, primero deberá llamar a utf8_encode() en cada parte del texto, o escribir un simple utf8_encode() recursivo. Para su caso de ejemplo, esto haría:

function myEncode($o) 
    $o->title = utf8_encode($o->title);
    return json_encode($o);

Me gustaría referirlo sobre este problema, en el enlace le sugiero que use un contenedor json_encode como este:

function safe_json_encode($value)
    if (version_compare(PHP_VERSION, '5.4.0') >= 0) 
        $encoded = json_encode($value, JSON_PRETTY_PRINT);
     else 
        $encoded = json_encode($value);
    
    switch (json_last_error()) 
        case JSON_ERROR_NONE:
            return $encoded;
        case JSON_ERROR_DEPTH:
            return 'Maximum stack depth exceeded'; // or trigger_error() or throw new Exception()
        case JSON_ERROR_STATE_MISMATCH:
            return 'Underflow or the modes mismatch'; // or trigger_error() or throw new Exception()
        case JSON_ERROR_CTRL_CHAR:
            return 'Unexpected control character found';
        case JSON_ERROR_SYNTAX:
            return 'Syntax error, malformed JSON'; // or trigger_error() or throw new Exception()
        case JSON_ERROR_UTF8:
            $clean = utf8ize($value);
            return safe_json_encode($clean);
        default:
            return 'Unknown error'; // or trigger_error() or throw new Exception()
    



function utf8ize($mixed) 
    if (is_array($mixed)) 
        foreach ($mixed as $key => $value) 
            $mixed[$key] = utf8ize($value);
        
     else if (is_string ($mixed)) 
        return utf8_encode($mixed);
    
    return $mixed;

Y después de definir estas funciones, puede usarlas directamente,

echo safe_json_encode($response);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *