2012-04-17 14 views
39

Bu kodu ben fonksiyonları, html_entities_decode, utf8_encode ve şifresini çözmek, hex kodlarını deşifre çok denedimphp json_decode dosyasında JSON_ERROR_UTF8 hatası nasıl çözülür?

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

çalışıyorum, ama her zaman hata "JSON_ERROR_UTF8" olsun.

Bunu nasıl çözebilirim?

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

Kredi:

+1

iconv() daha iyi çalışır:

Ben böyle bir json_encode sarmalayıcı kullanmanızı öneririz . Bu URL tarafından döndürülen JSON, çiftler kullanması gereken tek tırnak kullandığı için geçerli değil. JSON LINT (http://jsonlint.com/) iletmez. Yani, "x $" kodunuzun 2. satırında "json" olmalı mıyım? – JAAulde

+0

Evet, kodu temizliyordum ve $ x değerini değiştirmeyi unuttum, geçerli hale getirmeyi denediniz mi ve daha sonra bunu çözmeyi denediniz mi? Bunu nasıl geçerli hale getireceğimi bilemezdim. –

+0

Tüm tek tırnakları iki katına değiştirmeyi denedim, ancak diğer doğrulama sorunlarıyla karşılaştım. Hala bir göz atıyor. – JAAulde

cevap

44

Sen kod basit bir hatta ihtiyacı Le Sang, benim Teamate bana bu kodu verdi. Evet!

+1

Benim için çalışmıyor 'PHP Uyarı: iconv(): 4'üncü satırda /tmp/parse_json.php içinde giriş dizgisinde geçersiz bir karakter algılandı. Ve yanlış – mente

+4

döndürür Teşekkürler, ahbap! Günümü kurtardın! – null

+0

Bu harika, teşekkürler – caro

6

Girdinin geçerli olduğunu garanti edemediğiniz sürece, iconv işlevi oldukça değersizdir. Bunun yerine mb_convert_encoding kullanın.

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

Sen "auto" daha açık olsun ve hatta beklenen girdi kodlamaların virgülle ayrılmış listesi belirtebilirsiniz.

En önemlisi, geçersiz karakterler, tüm dizenin atılmasına neden olmadan işlenir (iconv'den farklı olarak). Dizilerinizi dezenfekte etmek için

48

There is a good function. başvurum utf8_encode olarak

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

() hatası UTF8 hata olarak çıkıyor neden emin değilim

+0

Benim için çalışıyor. Teşekkürler! – perelin

+0

Sonunda, aslında benim için çalışan bir şey! teşekkür ederim!! – userX

+0

Teşekkürler. Benim için çalıştı. –

İlgili konular