serialize 序列化
unserialize 反序列化
$content = 'a:5:{s:4:"img1";s:5:"35568";s:4:"img2";s:5:"35569";s:4:"img3";s:5:"35570";s:4:"img4";s:5:"35571";s:4:"img5";s:13:"要和商品";}';
$content2 = unserialize($content);
var_dump($content2);
echo json_last_error();
die;
此时打印结果为false
出现这种问题的原因是序列化数据时的编码与反序列化时的编码不一致导致,例如数据库是latin1和UTF-8字符长度不一样。
另外有可能出问题的还有单双引号,ascii字符"\0"被解析为 '\0',\0在C中是字符串的结束符等于chr(0),错误解析后算了2个字符。
\r在计算长度时也会出问题。
function mb_unserialize($serial_str) { $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); $serial_str= str_replace("\r", "", $serial_str); return unserialize($serial_str); } function asc_unserialize($serial_str) { $serial_str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str ); $serial_str= str_replace("\r", "", $serial_str); return unserialize($serial_str); }
$content = 'a:5:{s:4:"img1";s:5:"35568";s:4:"img2";s:5:"35569";s:4:"img3";s:5:"35570";s:4:"img4";s:5:"35571";s:4:"img5";s:13:"要和商品";}'; $content2 = unserialize($content); var_dump($this->mb_unserialize($content)); echo json_last_error(); die;
解决问题 载: