utf-8中的bom u+feff与json decode错误

今天用python调用别人的一个API,结果在读取到返回并尝试json.loads时,无论怎么试都抛出No JSON object could be decoded。

于是果断将返回结果打印出来调试一下,结果发现打印出来的字符串没有任何问题,并且直接复制过去完全可以loads的。

折腾了很久各种试,最后尝试在python命令行中获取结果,这时候没加print,问题终于看出来了:返回的字符串最前面是一个\ufeff,这不就是很明显的utf-8 bom吗?问题终于找到了。

所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space。

然后了解到对方的接口是php写的,马上想到了是他们在windows下编辑php代码,编辑器给自动加上了bom头了。

解决办法就是找到这个文件并把bom头干掉,可是文件那么多,怎么办呢?

grep -r -I -l $'^\xEF\xBB\xBF' ./

文件找到,删除bom头,问题解决。

2015年03月13日