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=filegetcontents(“f:data.json”)之后能够输出json,但是data = 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