美文网首页
小程序 -- json返回\ufeff 非法字符

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

作者: zdh229 | 来源:发表于2017-08-21 11:13 被阅读0次

    最近在开发小程序的时候,发现从服务器返回的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);
      }
    
     }
    
    ?>
    
    

    相关文章

      网友评论

          本文标题:小程序 -- json返回\ufeff 非法字符

          本文链接:https://www.haomeiwen.com/subject/ksrcdxtx.html