2011-11-15 14 views
11

Estoy leyendo de la base de datos con un texto en hebreo y tratando de json_encode. si print_r los resultados que obtengo:php json_encode() show null en lugar de texto

Array 
(
    [0] => Array 
     (
      [value] => 88 
      [text] => כיתה א' 
      [parent_id] => 1 
      [level] => 1 
     ) 

    [1] => Array 
     (
      [value] => 89 
      [text] => כיתה ב' 
      [parent_id] => 1 
      [level] => 1 
     ) 

    [2] => Array 
     (
      [value] => 91 
      [text] => כיתה ג' 
      [parent_id] => 1 
      [level] => 1 
     ) 

) 

mientras que el json_encode muestra:

[{"value":"88","text":null,"parent_id":"1","level":"1"},{"value":"89","text":null,"parent_id":"1","level":"1"},{"value":"91","text":null,"parent_id":"1","level":"1"}] 

i belive que es porque mi texto de la base de datos contiene un (') marca. intenté varias combinaciones de stripslashes o real_escape_string que ninguno ha ayudado.

+0

No es el ' '' cotización. Lo más probable es que su codificación de texto no sea UTF-8. ¿O qué juego de caracteres tienen las tablas de la base de datos? – mario

+0

¿Qué codificación de caracteres estás usando? El problema definitivamente parece ser el que falta ', parece que necesita limpiar los datos del DB codificándolo en UTF-8 –

+0

json_encode solo funciona con cadenas utf-8 de acuerdo con los documentos. compruebe la salida de 'json_last_error()'. http://php.net/json-last-error. utf8 codifica tus cadenas antes de llamar a json_encode. –

Respuesta

19

json_encode espera que las cadenas en los datos se codifiquen como UTF-8.

convertirlos a UTF-8 si no están ya:

$results = array_map(function($r) { 
    $r['text'] = utf8_encode($r['text']); 
    return $r; 
}, $results); 
echo json_encode($results); 
+0

ahora imprimió: [{"value": "88", "text": "\ u00eb \ u00e9 \ u00fa \ u00e4 \ u00e0 '", "parent_id": "1", "level": "1"}, { "valor": "89", "texto": "\ u00eb \ u00e9 \ u00e4 \ u00e4 \ u00e1 '", "parent_id": "1", "nivel": "1"}, {"valor": "91 "," text ":" \ u00eb \ u00e9 \ u00fa \ u00e4 \ u00e4 "," parent_id ":" 1 "," level ":" 1 "}] ¿así es como se supone que es? no estoy supuesta a verlo como texto? –

+1

@ eric.itzhak Sí, eso es JSON válido. Si lo vuelve a analizar, los escapes Unicode se correlacionarán con las cadenas UTF-8 apropiadas. Si desea que el JSON no contenga estos escapes, dé la opción 'JSON_UNESCAPED_UNICODE' a' json_encode' (solo php 5.4+). Tenga en cuenta que el escape Unicode le permite a su JSON atravesar canales opacos de 8 bits (es decir, programas que no manejan correctamente la codificación). Pierdes esto cuando especifica 'JSON_UNESCAPED_UNICODE'. – phihag

+0

Gracias phihag! eres un salvavidas :) –

0

Pruebe json_encode($string, JSON_UNESCAPED_UNICODE); (solo para PHP v5.4.0 + - vea docs).

+0

Si usa este método, deberá agregar el encabezado. [Cómo evitar que json_encode() elimine cadenas con caracteres no válidos] (http: // stackoverflow.com/questions/4663743/how-to-keep-json-encode-from-dropping-strings-with-invalid-characters) 'header ('Content-Type: application/json; charset = utf-8');' – Wingman1487

1
$dbh = new PDO('mysql:host=localhost;dbname=test', 
       $user, 
       $pass 
      ); 

$dbh->exec("SET CHARACTER SET utf8"); 

o

$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", 
       $dbuser, 
       $dbpass, 
       array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
      ); 
0
function change_null($d) 
{ 
    if (is_array($d)) { 
     foreach ($d as $k => $v) { 
      $d[$k] = change_null($v); 
     } 
    } else if(is_null($d)) 
    { 
     return ''; 
    } 
    return $d; 
} 

Esta función recursiva cambiará los valores nulos a '' cadena vacía. Al llamar json_encode ($ your_array) a json_encode (change_null ($ your_array));

0

Una de las maneras más fáciles es CONFIGURAR el CHARSET para la consulta de MySQL. Si desea establecer el mismo conjunto de caracteres para todas sus consultas, solo agregue lo siguiente en su configuración o archivo de conexión de base de datos.

mysql_query('SET CHARACTER SET utf8'); 

Si lo que desea es que en las consultas específicas, a continuación, sólo tiene que utilizar este derecho antes de ejecutar sus consultas