在获取数据的时候从服务器端获取json格式字符串的时候,在服务器段明明用的是PHP的json_encode将数组转换成json字符串,但是另一端获取的json字符串用json_decode死活解析不了,返回NULL。我将返回的字符串复制到在线的json检查工具上,显示无效的字符,但是又没有提示是哪个字符除了问题。后来发现如果我将两个{}替换掉就可以检测成功,于是我以为是大括号难道会是中文下的?(自动转换的还他妈有问题?)最终也没能发现大括号有什么问题。然后我觉得将那段json字符串和自己输入的大括号进行urlencode,然后发现了问题:

本应是 {“error”:…… 的变成了如下的样子。

BOM

好,这就有问题了。发现 { 为 0x7B,而上面那串字符的 0x7B 在很靠后的位置,那前面的0xEF 0xBB 0xBF 0xEF 0xBB 0xBF 0xEF 0xBB 0xBF是他妈什么玩意??

我坚信这个问题不止我一个人有,所以直接百度那个字符串。原来是在Windows下UTF-8编码文件的头类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)以便用来识别UTF-8编码。一般来说不会有什么问题,但是PHP在接受字符串的时候讲那个东西加入到了前面,所以造成了我无法解析json字符串。

百度了方法,我在服务器端加入了头header(“Content-type: text/html; charset=utf-8”);

但是还是不行。心中草泥马奔腾,我直接用二进制编辑器WinHex打开文件,去掉了前面三个字节的BOM头,重新试验接受解析,成功!还有一种方法,可以用Notepad++打开,在encode菜单中选择Convert to UTF-8 without BOM,也可以去掉BOM头。(法克我原来还一直以为里面直接的UTF-8编码兼容性高呢,原来without BOM才是正确选择!)