小程序 -- json返回\ufeff 非法字符

最近在開發(fā)小程序的時(shí)候,發(fā)現(xiàn)從服務(wù)器返回的JSON數(shù)據(jù)有時(shí)候能解析,有時(shí)候解析不了。

1、前提描述

我們發(fā)現(xiàn),如果直接從服務(wù)器端返回JSON字符串,小程序收到的就會是object對象。像這樣:


這里直接返回的json字符串。


這里收到的是object。這可能是微信替我們轉(zhuǎn)好了,不多說。

2、問題描述

突然一次,程序跑卡住了,不往下跑了。于是發(fā)現(xiàn)返回的data并不是object了,而是一個(gè)看似JSON的字符串。



這里的data 看起來就是一個(gè)JSON字符串。


然后嘗試去 JSON.parse(data),解析失敗。委曲求全,eval('(' + data + ')')的方式去解析,發(fā)現(xiàn)是可以的。但這不是我想要的。繼續(xù)找問題。


通過微信開發(fā)工具調(diào)試模式下Network看到返回的東西前面有兩個(gè)小紅點(diǎn),鼠標(biāo)放上去彈出\ufeff,搜索之,非法字符?

3、解決方法

從網(wǎng)上搜了下,如果用windows自帶的文本編輯器編輯過文件,就會自動添加上BOM頭,很難發(fā)現(xiàn) ,找了一段代碼,去掉BOM頭。
PS : 服務(wù)器我用的php環(huán)境
代碼鏈接 www.douban.com/note/332229277/

上傳代碼至服務(wù)器項(xiàng)目目錄 , 運(yùn)行發(fā)現(xiàn)原來是微信登錄提供的代碼帶有BOM頭。把代碼中的 $auto 改為 1 , 就可以刪除BOM頭了。問題解決。

PHP代碼附錄


class CheckDom {
  private $auto;
  public function index(){
    header('content-Type: text/html; charset=utf-8');
    if(isset($_GET['dir'])){//設(shè)置文件目錄,如果沒有設(shè)置,則自動設(shè)置為當(dāng)前文件所在目錄
    $basedir=$_GET['dir'];
    }else{
    $basedir='.';
    }
    $this->auto=0;/*設(shè)置為1標(biāo)示檢測BOM并去除,設(shè)置為0標(biāo)示只進(jìn)行BOM檢測,不去除*/
    echo'當(dāng)前查找的目錄為:'.$basedir.'當(dāng)前的設(shè)置是:';
    echo$this->auto?'檢測文件BOM同時(shí)去除檢測到BOM文件的BOM':'只檢測文件BOM不執(zhí)行去除BOM操作';
    $this->checkdir($basedir);
  }

  function checkdir($basedir){
    if($dh=opendir($basedir)){
    while(($file=readdir($dh)) !==false){
      if($file!='.'&&$file!='..'){
        if(!is_dir($basedir.'/'.$file)){
          echo'文件: '.$basedir.'/'.$file.$this->checkBOM($basedir.'/'.$file).'';
        }else{
          $dirname=$basedir.'/'.$file;
          $this->checkdir($dirname);
        }
      }
    }
    closedir($dh);
    }
  }

  function checkBOM($filename){
    $contents=file_get_contents($filename);
    $charset[1]=substr($contents,0,1);
    $charset[2]=substr($contents,1,1);
    $charset[3]=substr($contents,2,1);
    if(ord($charset[1])==239&& ord($charset[2])==187&&ord($charset[3])==191){
      if($this->auto==1){
        $rest=substr($contents,3);
        $this->rewrite($filename,$rest);
        return(' 找到BOM并已自動去除');
      }else{
        return(' 找到BOM');
      }
    }else{
      return(' 沒有找到BOM');
    }
  }

  function rewrite($filename,$data){
    $filenum=fopen($filename,'w');
    flock($filenum,LOCK_EX);
    fwrite($filenum,$data);
    fclose($filenum);
  }

 }

?>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,045評論 4 61
  • 一個(gè)企業(yè)是否能順利發(fā)展,一定要講究雙贏,同時(shí)要掌控短期和長期利益。只看眼前,很難發(fā)展。 我們要想有蛋吃有肉吃,一定...
    小笨魚王月閱讀 135評論 0 0
  • 這是一個(gè)高速發(fā)展的時(shí)代,互聯(lián)網(wǎng)帶給我們莫大的機(jī)遇,網(wǎng)絡(luò)猶如社會神經(jīng)脈絡(luò),將彼此連接在一起。許多人用自己現(xiàn)在所謂的“...
    子萱姐姐閱讀 281評論 0 0

友情鏈接更多精彩內(nèi)容