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;
}