原因: json_encode($str) 中的字符串 必須是 utf-8的格式:
--------------------------------
問題描述:
返回的json數據:
1 <?php 2 $array = array(); 3 $rows = $parameter["list"]; 4 $User = $parameter["User"]; 5 $userId = $parameter["userId"]; 6 $data = ''; 7 $data.= ' 8 <table class="table table-striped table-hover"> 9 <tbody>'; 10 foreach ($rows["rows"] as $row){ 11 $data.= '<tr> 12 <td width="40px"><input type="checkbox" name="checkItem" value="'.$row->id.'" /></td>'; 13 $data.= '<td width="200px">'.BaseUtil::setEntities($row->title).'</td>'; 14 $User->getDataById($row->userId); 15 $data.= '<td width="200px">'.BaseUtil::setEntities($User->userName).'</td>'; 16 $data.= '<td width="200px">'.'<img style="width:100px;" src="'.UPLOAD_HTTP.$row->icon.'"/>'.'</td>'; 17 $data.= '<td width="200px">'.BaseUtil::setEntities($row->orderBy).'</td>'; 18 $data.= '<td width="200px">'.BaseUtil::setEntities($row->isOpenEnum[$row->isOpen]).'</td>'; 19 $data.= '<td width="200px"> 20 <button type="button" class="btn btn-success btn-sm" onclick="base.addTab(\'知識點管理\',\'action.php?c=KnowledgeProxy&a=index&courseId='.$row->id.'\',\'課程管理\')"> 21 <span class="glyphicon glyphicon-pencil" style="color:#fff; cursor:pointer;"></span> 22 知識點管理 23 </button> 24 </td>'; 25 $data.= '<td width="100px"> 26 <span class="table-list-btn glyphicon glyphicon-edit" title="編輯" style="color:#2e6da4; cursor:pointer;" onclick="base.showCourseUpdate('.$row->id.')"></span> 27 <span class="table-list-btn glyphicon glyphicon-trash" title="刪除" style="color:#d43f3a; cursor:pointer;" onclick="base.removeCourse('.$row->id.')"></span> 28 </td> 29 </tr>'; 30 } 31 $data.= '</tbody></table>'; 32 $array ["data"] = $data; 33 $array ["total"] = $rows ["total"]; 34 echo BaseUtil::toJson($array); 35 ?>
setEntities 方法:
1 /** 2 * 轉字符換為實體 3 * 4 * @param unknown $string 5 * @return string 6 */ 7 public static function setEntities($string) { 8 return htmlentities ( $string); 9 }
出現的問題是 :
1)在公司里面 返回的json數據是正常的 . 例如:
2) 但是如果 是在家里 ,就出現錯誤. data 是null
{data: null , total:3}
同樣的代碼 ,只是因為在公司和 家中的php環境不同 就出現了不同的結果.
-----------
測試如果不使用:BaseUtil::setEntities($User->userName) 處理數據 ,直接用$User->userName 的話,在家中 就可以正常使用了.
BaseUtil::setEntities 是對函數 htmlentities的封裝.
1 /** 2 * 轉字符換為實體 3 * 4 * @param unknown $string 5 * @return string 6 */ 7 public static function setEntities($string) { 8 return htmlentities ( $string ); 9 }
查閱php手冊中關於 htmlentities的描述:
可見,htmlentities 是要設置轉換的格式的, 如果沒有設置, 默認讀取 php配置文件中的 default_charset;
同時在 php 5.4 之后 ,默認的轉碼為 utf-8 .
同時 ,json_encode 要求 字符串必須是utf-8的.
-------
所以問題 就是 我公司的電腦的php版本大於 5.4 ,使用 封裝的BaseUtil::setEntities 自動轉為 utf-8 ; 家中的電腦的php版本 低於5.4
----
解決辦法:
第一: 將家中電腦的php.ini 的 default_charset 設置為 utf-8 , 但是沒有起作用.
第二: 重寫 BaseUtil::setEntities ,指定格式 . 此時家中 可以正常使用了.
1 /** 2 * 轉字符換為實體 3 * 4 * @param unknown $string 5 * @return string 6 */ 7 public static function setEntities($string) { 8 return htmlentities ( $string, ENT_COMPAT , 'utf-8' ); 9 }