2012-04-17 29 views
39

tôi đang cố gắng mã nàyCách giải quyết lỗi JSON_ERROR_UTF8 trong 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; 
} 

Tôi đã thử rất nhiều chức năng, html_entities_decode, utf8_encode và giải mã, giải mã các mã hex, nhưng tôi luôn luôn nhận được lỗi "JSON_ERROR_UTF8".

Tôi làm cách nào để giải quyết vấn đề này?

+1

Tôi không chắc chắn lý do tại sao các lỗi được sắp ra như một lỗi UTF8 . JSON được trả lại bởi URL đó không hợp lệ vì nó sử dụng dấu nháy đơn, nơi nó nên sử dụng gấp đôi. Nó không vượt qua JSON LINT (http://jsonlint.com/). Điều đó nói rằng, tôi giả sử '$ x' trên dòng 2 của mã của bạn nên là' $ json'? – JAAulde

+0

Có, tôi đã làm sạch mã và quên thay đổi $ x, bạn đã thử làm cho nó hợp lệ và sau đó cố gắng giải mã nó? Tôi sẽ không biết cách làm cho nó hợp lệ. –

+0

Tôi đã thử thay thế tất cả các dấu nháy đơn bằng cách tăng gấp đôi, nhưng sau đó chạy vào các vấn đề xác nhận khác. Vẫn đang xem. – JAAulde

Trả lời

44

Bạn cần dòng mã đơn giản:

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

Credit: Chưởng Môn Lê Sáng, teamate của tôi đã cho tôi mã này. Yeah!

+1

Không hoạt động đối với tôi 'PHP Chú ý: iconv(): Đã phát hiện một ký tự không hợp lệ trong chuỗi đầu vào trong /tmp/parse_json.php trên dòng 4'. Và trả về false – mente

+4

Cảm ơn, anh bạn! Bạn đã cứu ngày của tôi! – null

+0

điều này thật tuyệt vời, cảm ơn bạn – caro

6

Chức năng biểu tượng là khá vô giá trị trừ khi bạn có thể đảm bảo đầu vào hợp lệ. Sử dụng mb_convert_encoding để thay thế.

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

Bạn có thể rõ ràng hơn "tự động" và thậm chí chỉ định danh sách mã hóa đầu vào được mong đợi được phân tách bằng dấu phẩy.

Quan trọng nhất, các ký tự không hợp lệ sẽ được xử lý mà không làm cho toàn bộ chuỗi bị hủy bỏ (không giống như iconv).

48

There is a good function để khử trùng mảng của bạn.

tôi đề nghị bạn sử dụng một wrapper json_encode như thế này:

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

Trong utf8_encode ứng dụng của tôi() hoạt động tốt hơn so với iconv()

+0

Làm việc cho tôi. Cám ơn! – perelin

+0

cuối cùng, một cái gì đó thực sự làm việc cho tôi! cảm ơn bạn!! – userX

+0

Cảm ơn. Đã làm cho tôi. –

Các vấn đề liên quan