2011-04-25 50 views
2

怎麼可能是包含?或其他特殊字符的字符串返回爲空?不僅是特殊字符是闊葉但整個字符串(值)返回空...json_encode()

編輯:

class JSON { 
    static function encode($arr, $utf8_encode=false){ 
     $arr = self::parse_int($arr); 

     if($utf8_encode){ 
      array_walk_recursive($arr, array(self => 'utf8_enc')); 
     } 

     return $arr ? json_encode($arr):'{}'; 
    } 

    static function decode($str){ 
     return json_decode($str, true); 
    } 

    function utf8_enc(&$value, $key){ 
     $value = utf8_encode($value); 
    } 

    function parse_int($arr){ 
     foreach($arr as $key => $value){ 
      if(is_array($value)){ 
       $arr[$key] = self::parse_int($value); 
      } 
      else{ 
       if(is_numeric($value)){ 
        settype($value, 'float'); 
       } 

       $arr[$key] = $value; 
      } 
     } 

     return $arr; 
    } 
} 

,但我得到這個錯誤:

Warning: array_walk_recursive() expects parameter 2 to be a valid callback, array must have exactly two members 

在這一行:

array_walk_recursive($arr, array(self => 'utf8_enc')); 

如何在當前對象中定義函數?

回答

3

發送到json_encode函數的所有字符串應該是UTF8編碼的。沒有例外。你可以使用iconv或utf8_encode來幫助你。

+0

我已經編輯我的文字:) – clarkk 2011-04-25 14:42:17

+0

爲了用靜態方法使用array_walk_recursive你應該直接實例:array_walk_recursive($改編,「JSON :: utf8_enc」);或者,如果它只是一個公共方法:array_walk_recursive($ arr,array($ this =>'utf8_enc'));或者,如果只是一個公共方法:array_walk_recursive($ arr,array($ this =>'utf8_enc')); – 2011-04-25 14:50:34

+0

我想你會換array_walk_recursive($ arr,'JSON :: utf8_enc'); ? :) – clarkk 2011-04-25 14:53:33

2

json_encoderequires送入它的字符串以UTF-8編碼。如果您調用它並以任何單字節編碼傳遞此類字符,則返回值爲null

+0

我已經編輯我的文字:) – clarkk 2011-04-25 14:45:24

0

嗯,我把你的課程和改進了一點點。沒有理由將內部類方法聲明爲靜態。您的編碼和解碼方法可以是靜態的,但parse_int和utf8_enc可以是簡單的私有方法。

<?php 

class JSON { 
    public function encode($arr, $utf8_encode = false) { 
     $arr = $this->parse_int($arr); 

     if ($utf8_encode) { 
      array_walk_recursive($arr, array($this, 'utf8_enc')); 
     } 

     return $arr ? json_encode($arr) : '{}'; 
    } 

    public function decode($str) { 
     return json_decode($str, true); 
    } 

    private function utf8_enc(&$value, $key) { 
     $value = utf8_encode($value); 
    } 

    private function parse_int($arr) 
    { 
     foreach ($arr as $key => $value) { 
      if (is_array($value)) { 
       $arr[$key] = $this->parse_int($value); 
      } else { 
       if (is_numeric($value)) { 
        settype($value, 'float'); 
       } 
       $arr[$key] = $value; 
      } 
     } 

     return $arr; 
    } 
} 

$json = new JSON; 
echo $json->encode(array('áé[email protected](*&dásásd?eq'), true);