2012-04-17 90 views
39

我想這個代碼如何解決php json_decode中的JSON_ERROR_UTF8錯誤?

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

我已經嘗試了很多功能,html_entities_decode,函數utf8_encode和解碼,解碼的十六進制代碼,但我總是得到錯誤「JSON_ERROR_UTF8」。

我怎麼能解決這個問題?

+1

我不知道爲什麼錯誤是走出來的UTF8錯誤更好。由該URL返回的JSON無效,因爲它使用雙引號的地方應該使用雙引號。它不通過JSON LINT(http://jsonlint.com/)。也就是說,我假設你的代碼的第2行中的$ x應該是'$ json'? – JAAulde 2012-04-17 21:01:35

+0

是的,我正在清理代碼,並忘記更改$ x,你有沒有嘗試使它有效,然後試圖解碼它?我不知道如何使其有效。 – 2012-04-17 21:09:13

+0

我試過用雙打替換所有的單引號,但後來碰到其他驗證問題。仍然看一看。 – JAAulde 2012-04-17 21:09:52

回答

44

你需要的代碼簡單行:

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

來源:桑樂,我teamate給了我這個代碼。是啊!

+1

對我不起作用PHP注意:iconv():在第4行中的/tmp/parse_json.php中檢測到輸入字符串中的非法字符。並返回false – mente 2013-11-13 08:53:56

+4

謝謝,夥計!你救了我的一天! – null 2014-07-02 10:19:33

+0

這太棒了,謝謝 – caro 2017-06-19 13:59:22

6

iconv函數非常值錢,除非您可以保證輸入有效。改爲使用mb_convert_encoding。

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

您可以比「auto」更明確,甚至可以指定逗號分隔的期望輸入編碼列表。

最重要的是無效字符會不會導致整個字符串處理被丟棄(不同的iconv)。

48

There is a good function來清理您的陣列。

我建議你使用json_encode包裝是這樣的:

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

在我的應用程序函數utf8_encode()的作品比的iconv()

+0

適合我。謝謝! – perelin 2014-12-15 16:09:39

+0

終於,真正爲我工作的東西!謝謝!! – userX 2015-04-27 17:33:30

+0

謝謝。爲我工作。 – 2015-12-25 17:30:14