
問題現象
用json_decode()對JSON字符串進行編碼轉換成PHP變量時發(fā)現返回值為null,而且無明顯的參數錯誤。
問題原因
百思不得其解,最后調試發(fā)現被轉換的json字符串開頭莫名其妙的帶上了"\ufeff",查詢后得知這是由于PHP項目文件中存在帶BOM格式文件,導致使用json_encode()編碼的json字符串開頭會帶有"\ufeff",也就是傳入了帶BOM格式的UTF-8數據,在PHP5.2以后,json_encode()只能接受UTF-8無BOM編碼格式的數據。json_decode()解析非UTF-8無BOM格式的數據就會返回null。
解決方法
- 方法一(堵漏法)
既然在json_encode()中傳入了帶BOM格式的UTF-8數據,導致了問題,那么我們可以在傳入參數前,對參數進行一下過濾,也就是移除參數中的BOM,PHP代碼如下:
$result = trim($result, "\xEF\xBB\xBF"); - 方法二(治本法)
導致問題的根本原因是項目中存在帶BOM格式的UTF-8文件,那么要從根本上解決問題就必須將帶BOM格式文件轉換成無BOM格式文件,在linux下可以通過下面兩條命令查找?guī)OM格式文件和將文件轉換成無BOM格式:
# 在項目根目錄,查找項目中帶BOM格式文件并顯示
grep -r -I -l $'^\xEF\xBB\xBF' ./
# 在存在BOM格式文件的目錄,將目錄下所有文件去除BOM頭
# (注意:不能對圖片進行此操作,否則會導致圖片打不開)
find . -type f -exec sed -i 's/\xEF\xBB\xBF//' {} \;