出現這個錯誤,可能會有幾種原因,網上搜索的答案基本也是比較有針對性的一方面,關鍵在如何去尋找原因,并解決它。
分析一:在數據進行存儲并反序列化時編碼問題出錯
這個原因是很常見的,比方,原本是以GBK編碼進行存儲,然后是UTF-8編碼的,那么在進行unserialize()就會有問題;
解決方法一:將UTF-8編碼的數據轉換成GBK,PHP語言可以用iconv()函數;
分析二:重寫反序列函數
一些情況可以把底層的函數重寫,將gb2312轉換成utf-8格式之后,每個中文的字節數從2個增加到3個之后導致了反序列化的時候判斷字符長度出現了問題,所以需要使用正則表達式將序列化的數組中的表示字符長度的值重新計算一遍,代碼如下:
- function mb_unserialize($serial_str) {
- $out = preg_replace('!s:(/d+):"(.*?)";!se', "'s:'.strlen('$2').':/"$2/";'", $serial_str );
- return unserialize($out);
- }
解決方法三:對字符數據進行base64_encode,然后serialize序列化,還原提取時,unserialize()再base64_decode
新聞熱點
疑難解答