file_get_contents,json_decode,json,null,bom

PHP读取本地JSON文件时后,使用json_decode函数返回null的解决方法
其实,很多新手在这里总是会遇到坑,在做测试实验时,明明 j s o n s t r i n g = f i l e g e t c o n t e n t s ( “ f : d a t a . j s o n ” ) 之 后 能 够 输 出 j s o n , 但 是 json_string = file_get_contents(“f:data.json”)之后能够输出json,但是 jsonstring=filegetcontentsf:data.jsonjsondata = json_decode( j s o n s t r i n g ) ; 之 后 , v a r d u m p ( json_string);之后,var_dump( jsonstring);vardump(data);却输出NULL。
这里其实是一个BOM的问题。

BOM头在记事本中是看不到的
以UTF8为例,新建一个1.txt文件,然后打开文件 输入 hello world 然后另存为 此时更改文件的编码格式 由默认的ANSI 即GB2312(国标2312)编码改成UTF8

然后通过下面的node代码,来打印该文本文件的buffer 就可以看到我们所说的BOM头字符

let fs = require('fs');
fs.readFile('./1.txt',function(err,data){
    console.log(data)
})
// <Buffer ef bb bf 68 65 6c 6c 6f 20 77 6f 72 6c 64>
// 前三个字节就是对应的我们UTF8编码的文本的BOM头字符

有两个方法可以去掉BOM头
1:选择无BOM头的UTF8编码重新存储文件

2:使用node中的文件模块获取文件的buffer数据并去掉前三个字节,代码如下:

function deleteUtf8BomHead(path) {
    let buf = fs.readFileSync(path);
    if (buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf) {
        buf = buf.slice(3)
    }
    return buf
}

console.log(deleteUtf8BomHead('./1.txt'));// <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>

// 将GBK编码的buffer转化成utf8的字符串
// 在这里我们要引入一个库 iconv-lite
let iconv = require(‘iconv-lite’);
fs.readFile(’./2.txt’,function (err, data) {
console.log(data,‘qq’);
let str = iconv.decode(data,‘gbk’);
console.log(str);
})
参考至这里:https://www.cnblogs.com/qinmengjiao123-123/p/8325646.html

在这里插入图片描述
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值