json非法字符有哪些_小程序 -- json返回\ufeff 非法字符

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

}

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值