recorrer json_decode example ejemplo php json utf-8

json_decode - return json php



Los valores en UTF-8 están codificados como NULL en JSON (5)

Intente enviar su matriz a través de esta función antes de hacer json_encode ():

<?php function utf8json($inArray) { static $depth = 0; /* our return object */ $newArray = array(); /* safety recursion limit */ $depth ++; if($depth >= ''30'') { return false; } /* step through inArray */ foreach($inArray as $key=>$val) { if(is_array($val)) { /* recurse on array elements */ $newArray[$key] = utf8json($inArray); } else { /* encode string values */ $newArray[$key] = utf8_encode($val); } } /* return utf8 encoded array */ return $newArray; } ?>

Tomado de un comentario en phpnet @ http://php.net/manual/en/function.json-encode.php .

La función básicamente recorre los elementos de la matriz, ¿quizás hiciste tu codificación utf-8 en la matriz misma?

Tengo un conjunto de palabras clave que pasan a través de JSON desde un DB (UTF-8 codificado), algunas de las cuales pueden tener caracteres especiales como é, è, ç, etc. Esto se usa como parte de un autocompletador. Ejemplo:

array(''Coffee'', ''Cappuccino'', ''Café'');

Debo añadir que la matriz tal como viene de la base de datos sería:

array(''Coffee'', ''Cappuccino'', ''Café'');

Pero JSON codifica como:

["coffee", "cappuccino", null];

Si imprimo esto a través de print_r (), aparecen bien en una página web codificada en UTF-8, pero el café aparece como "café" si se usa texto / plano si quiero ver la matriz usando print_r ($ array) ;salida();.

Si codigo usando utf8_encode () antes de codificar a JSON, viene bien, pero lo que se imprime en la página web es "café" y no "café".

También es extraño, pero json_last_error () se ve como una función indefinida, pero json_decode () y json_encode () funcionan bien.

¿Alguna idea sobre cómo obtener datos codificados en UTF-8 de la base de datos para comportarse de la misma manera durante todo el proceso?

EIDT: Aquí está la función de PHP que toma las palabras clave y las convierte en una sola matriz:

private function get_keywords() { global $db, $json; $output = array(); $db->query("SELECT keywords FROM listings"); while ($r = $db->get_array()) { $split = explode(",", $r[''keywords'']); foreach ($split as $s) { $s = trim($s); if ($s != "" && !in_array($s, $output)) $output[] = strtolower($s); } } $json->echo_json($output); }

El método json :: echo_json solo codifica, establece el encabezado y lo imprime (para usar con Prototype)

EDITAR: método de conexión DB:

function connect() { if ($this->set[''sql_connect'']) { $this->connection = @mysql_connect( $this->set[''sql_host''], $this->set[''sql_user''], $this->set[''sql_pass'']) OR $this->debug( "Connection Error", mysql_errno() .": ". mysql_error()); $this->db = @mysql_select_db( $this->set[''sql_name''], $this->connection) OR $this->debug( "Database Error", "Cannot Select Database ''". $this->set[''sql_name''] ."''"); $this->is_connected = TRUE; } return TRUE; }

Más actualizaciones: script PHP simple que ejecuté:

echo json_encode( array("Café") ); // ["Caf/u00e9"] echo json_encode( array("Café") ); // null


Probé tu código de ejemplo como este

[~]> cat utf.php <?php $arr = array(''Coffee'', ''Cappuccino'', ''Café''); print json_encode($arr); [~]> php utf.php ["Coffee","Cappuccino","Caf/u00e9"] [~]>

Basado en eso, diría que si los datos de origen son realmente UTF-8, entonces json_encode funciona bien. Si no es así, entonces es donde obtienes nulo. Por qué no es así, no puedo decir en base a esta información.


json_encode parece json_encode cadenas que contienen caracteres no válidos. Es probable que sus datos UTF-8 no lleguen en la forma correcta desde su base de datos.

Si miras los ejemplos que das, mi conjetura es que tu conexión a la base de datos no está codificada en UTF-8 y en su lugar sirve caracteres ISO-8859-1.

¿Puedes probar un SET NAMES utf8; después de inicializar la conexión?


Mi solución para codificar datos utf8 fue:

$jsonArray = addslashes(json_encode($array, JSON_FORCE_OBJECT|JSON_UNESCAPED_UNICODE))


La razón podría ser la configuración actual del carácter del cliente. Una solución simple podría ser establecer el cliente con mysql_query(''SET CHARACTER SET utf8'') antes de ejecutar la consulta SELECT .

Actualización (junio de 2014)

La extensión mysql está en desuso a partir de PHP 5.5.0. Ahora se recomienda usar mysqli. Además, en lecturas posteriores, se debe evitar la forma anterior de establecer el conjunto de clientes por razones que incluyen seguridad .

No lo he probado, pero este debería ser un sustituto correcto:

$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db"); if (!$mysqli->set_charset(''utf8'')) { printf("Error loading character set utf8: %s/n", $mysqli->error); } else { printf("Current character set: %s/n", $mysqli->character_set_name()); }

o con el parámetro de conexión:

$conn = mysqli_connect("localhost", "my_user", "my_password", "my_db"); if (!mysqli_set_charset($conn, "utf8")) { # TODO - Error: Unable to set the character set exit; }