2012-04-17 43 views
39

estoy tratando este códigoCómo solucionar el error JSON_ERROR_UTF8 en php json_decode?

$json = file_get_contents("http://www.google.com/alerts/preview?q=test&t=7&f=1&l=0&e"); 
print_r(json_decode(utf8_encode($json), true)); 

     ////////////// 

// Define the errors. 
$constants = get_defined_constants(true); 
$json_errors = array(); 
foreach ($constants["json"] as $name => $value) { 
    if (!strncmp($name, "JSON_ERROR_", 11)) { 
     $json_errors[$value] = $name; 
    } 
} 

// Show the errors for different depths. 
foreach (range(4, 3, -1) as $depth) { 
    var_dump(json_decode($json, true, $depth)); 
    echo 'Last error: ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL; 
} 

He probado una gran cantidad de funciones, html_entities_decode, utf8_encode y decodificación, la decodificación de los códigos hexadecimales, pero siempre me sale el error "JSON_ERROR_UTF8".

¿Cómo podría solucionar esto?

+1

No estoy seguro de por qué el error está saliendo como un error de UTF8 . El JSON devuelto por esa URL no es válido, ya que utiliza comillas simples donde debería usar dobles. No pasa JSON LINT (http://jsonlint.com/). Dicho eso, supongo que '$ x' en la línea 2 de tu código debe ser' $ json'? – JAAulde

+0

Sí, estaba limpiando el código y olvidé cambiar $ x, ¿ha intentado hacerlo válido y luego tratando de decodificarlo? No sabría cómo hacerlo válido. –

+0

He intentado reemplazar todas las comillas simples por dobles, pero luego me he encontrado con otros problemas de validación. Todavía echando un vistazo. – JAAulde

Respuesta

44

Usted necesita simple línea de código:

$input = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($input)); 
$json = json_decode($input); 

Crédito: Sang Le, mi teamate me dio este código. ¡Sí!

+1

No funciona para mí 'Aviso de PHP: iconv(): Detecté un carácter ilegal en la cadena de entrada en /tmp/parse_json.php en la línea 4'. Y devuelve falso – mente

+4

¡Gracias, amigo! ¡Salvaste mi día! – null

+0

esto es fantástico, gracias – caro

6

La función iconv no tiene ningún valor a menos que pueda garantizar que la entrada sea válida. Use mb_convert_encoding en su lugar.

mb_convert_encoding($value, "UTF-8", "auto"); 

Puede obtener más explícito que "auto", e incluso especificar una lista separada por comas de las codificaciones de entrada esperados.

Lo que es más importante, los caracteres no válidos se manejarán sin hacer que toda la cadena se descarte (a diferencia de iconv).

48

There is a good function para desinfectar sus matrices.

le sugiero que utilice un envoltorio json_encode así:

function safe_json_encode($value, $options = 0, $depth = 512){ 
    $encoded = json_encode($value, $options, $depth); 
    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, $options, $depth); 
     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; 
} 

En mi utf8_encode aplicación() funciona mejor que iconv()

+0

Funciona para mí. ¡Gracias! – perelin

+0

finalmente, ¡algo que realmente funcionó para mí! ¡¡gracias!! – userX

+0

Gracias. Trabajó para mi. –

Cuestiones relacionadas