UTF-8 BOM EF BB BF 问题 / 2018-08-09

今天遇到了一个让人抓狂的问题:服务API返回的JSON数据在微信小程序中一直无法自动解析,必须强制使用JSON.parse才可以正常解析出数据。

奇怪的ef bb bf ef bb bf ef bb bf ef bb bf

同一服务上的API,仅一两个接口出现这种情况。初步判断可能是该接口返回数据有特殊字符,但即使该接口返回空JSON依然有问题。经过仔细对比发现,出问题接口服务器响应JSON数据的二进制信息中多了ef bb bf ef bb bf ef bb bf ef bb bf这样的数据,那么这些数据是从哪里来的?

可恶的UTF-8 BOM

进过一番查询,发现原来是UTF-8 BOM惹得祸。代码文件,比如JSP,PHP等,如果文件采用的是UTF-8 BOM编码,如果未经处理,那么在经过渲染处理后,会把BOM信息直接返回给前端。所谓的BOM编码实际上就是Byte Order Mark,就是定义的网络字节序。由于是不可显示字符,所以出了问题难以发现。参考wiki:https://en.wikipedia.org/wiki/Byte_order_mark

去除UTF-8 BOM

解决办法就是去除BOM标记。使用Sublime Text等文本工具,选择Save with Encoding->UTF-8,去除BOM头部。

最后提醒:保存UTF8文件时,一定要注意不要使用BOM!