tipos simples simple reemplazar quitar problema escribir escape dentro con comillas comilla php json

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



php tipos de comillas (5)

Tengo un objeto stdClass llamado $post que, cuando se descarga a través de print_r() , devuelve lo siguiente:

stdClass Object ( [ID] => 12981 [post_title] => Alumnus'' Dinner Coming Soon [post_parent] => 0 [post_date] => 2012-01-31 12:00:51 )

json_encode() eco del resultado de llamar a json_encode() en este objeto produce lo siguiente:

{ "ID": "12981", "post_title": null, "post_parent": "0", "post_date": "2012-01-31 12:00:51" }

json_encode que algo con la comilla simple está causando que json_encode se json_encode , pero no sé qué formato se necesita para escapar de eso. ¿Algunas ideas?

EDITAR: Corrige la falta de coincidencia en los ejemplos de código. Estoy ejecutando PHP versión 5.3.8

EDIT2: Directamente después de codificar el objeto, hice esto:

echo json_last_error() == JSON_ERROR_UTF8;

Esto imprimió 1 , lo que significa que se produjo el siguiente error: "caracteres UTF-8 mal formados, posiblemente codificados incorrectamente". json_last_error()

EDIT3: Llamar a utf8_decode() en el título de la publicación resultó en lo siguiente: "¿Alumnus? Dinner Coming Soon". Estos datos se extraen de una base de datos MySQL; el título de la publicación, en particular, es un campo de texto codificado en UTF-8. ¿Tal vez esta cita simple está mal codificada? La cuestión es que tengo una aplicación de GUI de SQL, y aparece correctamente en eso.


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

  • llame a mysql_set_charset("utf8") si usa la antigua API obsoleta .
  • llama a mysqli_set_charset("utf8") si usas mysqli
  • agregue el parámetro charset a la cadena de conexión si usa PDO y PHP> = 5.3.6. En versiones anteriores necesita ejecutar SET NAMES utf8 .

Cuando obtiene datos de MySQL, cualquier texto se codificará en "codificación del cliente", que probablemente sea windows-1252 si no lo configura de otra manera. El personaje que está causando su problema es la "cita rizada", que se ve como 92 en el volcado hexadecimal, que confirma que el cliente mysql está codificando el 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 -encoded text. 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. Puede usar str_replace("/x92", "''", $input) para solucionar el problema de este personaje en particular, pero si hay alguna posibilidad de que haya otros caracteres no ASCII en la base de datos, querrá tener el uso del cliente UTF-8.


Lo que he tenido 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)

htmlspecialchars () dependiendo de cómo quiera usar la cadena JSON, puede dejar esto fuera

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

Como quiera json_encode un objeto, deberá llamar a utf8_encode () en cada parte de texto primero, o escribir un recursivo utf8_encode (). 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 tema, en el link 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 puedes usarlo directo,

echo safe_json_encode($response);


Puede intentar establecer el juego de caracteres en la configuración de la base de datos:

''charset'' => ''utf8'', ''driver_options'' => array( PDO::MYSQL_ATTR_INIT_COMMAND => ''SET NAMES /'UTF8/''' )


estaba teniendo el mismo problema mientras JSON codificaba una matriz php a partir de un resultado de consulta ODBC, el OBC de mi servidor está configurado con ''en_US.819'', es un servidor de producción, ¡así que no hay forma de que pueda siquiera tocar eso!

cuando intenté:

echo json_encode($GLOBALS[''response''], true);

Donde ''respose'' es una matriz con los resultados, funciona según lo previsto, siempre y cuando no esté presente ningún bizarre char, si es así, json_encode no puede volverse vacío.

¿La solución? .... UTF codifica los resultados mientras recupera las filas de la consulta:

$result = odbc_exec($conn, $sql_query); $response = array(); while( $row = odbc_fetch_array($result) ) { $json[''pers_identificador''] = $row[''pers_identificador'']; $json[''nombre_persona''] = utf8_encode( $row[''nombre_persona''] ); $json[''nombre_1''] = utf8_encode($row[''nombre_1''] ); $json[''nombre_2''] = utf8_encode($row[''nombre_2''] ); array_push($response, $json); }

Ahora json_encode funciona !!!, la cadena resultante es algo como esto:

{"page_id":300,"max_rows":"100","cant_rows":"12897","datos": [{"pers_identificador":"301","cedula":"15250068","interno_1":"178202","interno_2":"","nombre_persona":"JOSE JUAN PANDOLFO ZAGORODKO","nombre_1":"JOSE","nombre_2":"JUAN",....

Eso solucionó mi problema.