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

2017-08-21  本文已影响0人  zdh229

最近在开发小程序的时候,发现从服务器返回的JSON数据有时候能解析,有时候解析不了。

1、前提描述

我们发现,如果直接从服务器端返回JSON字符串,小程序收到的就会是object对象。像这样:


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


这里收到的是object。这可能是微信替我们转好了,不多说。

2、问题描述

突然一次,程序跑卡住了,不往下跑了。于是发现返回的data并不是object了,而是一个看似JSON的字符串。



这里的data 看起来就是一个JSON字符串。


然后尝试去 JSON.parse(data),解析失败。委曲求全,eval('(' + data + ')')的方式去解析,发现是可以的。但这不是我想要的。继续找问题。
通过微信开发工具调试模式下Network看到返回的东西前面有两个小红点,鼠标放上去弹出\ufeff,搜索之,非法字符?

3、解决方法

从网上搜了下,如果用windows自带的文本编辑器编辑过文件,就会自动添加上BOM头,很难发现 ,找了一段代码,去掉BOM头。
PS : 服务器我用的php环境
代码链接 www.douban.com/note/332229277/

上传代码至服务器项目目录 , 运行发现原来是微信登录提供的代码带有BOM头。把代码中的 $auto 改为 1 , 就可以删除BOM头了。问题解决。

PHP代码附录


class CheckDom {
  private $auto;
  public function index(){
    header('content-Type: text/html; charset=utf-8');
    if(isset($_GET['dir'])){//设置文件目录,如果没有设置,则自动设置为当前文件所在目录
    $basedir=$_GET['dir'];
    }else{
    $basedir='.';
    }
    $this->auto=0;/*设置为1标示检测BOM并去除,设置为0标示只进行BOM检测,不去除*/
    echo'当前查找的目录为:'.$basedir.'当前的设置是:';
    echo$this->auto?'检测文件BOM同时去除检测到BOM文件的BOM':'只检测文件BOM不执行去除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);
  }

 }

?>

上一篇下一篇

猜你喜欢

热点阅读