出現問題: 從數據庫中取出數據後進行反序列化後,php報錯 unserialize(): Error at offset 0 of 96 bytes;
分析原因:英文數據中含有中文字符串,所以我們就可以想到編碼的問題,serialize()函數對在不同編碼下對中文的處理結果是不一樣的。
再講gbk轉換成utf8的格式後,每個中文的編碼數從2個會增加到3個,所以會導致反序列化的時候判斷字符長度出現問題 。
解決方法 : 使用正則表達式將序列化的數組中的表示字符長度的值重新計算一遍
具體代碼:php5.5以下 :
function mb_unserialize($str) { $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str ); return unserialize($out); }
但是由於PHP本身 /e模式的漏洞,php5.5+,已經廢棄了這種用法
PHP 5.5+
function mb_unserialize($str) { return preg_replace_callback('#s:(\d+):"(.*?)";#s',function($match){return 's:'.strlen($match[2]).':"'.$match[2].'";';},$str); }