php 在utf8和gbk編碼下使用serialize和unserialize互相序列化和還原序列化會出現無法成功還原序列化的問題。
問題出現的原因主要是在不同編碼下strlenFunction Compute中文字串長度不同的原因。
代碼如下 |
複製代碼 |
<?php $array=array('title'=>'php教程分享網','url'=>'http://www.111cn.net'); echo serialize($array); //gbk編碼 a:2:{s:5:"title";s:13:"php教程分享網";s:3:"url";s:20:"http://www.111cn.net";} //utf8編碼 a:2:{s:5:"title";s:18:"php教程分享網";s:3:"url";s:20:"http://www.111cn.net";} ?>
|
要解決這個問題就要在還原序列化的時候重新修正字串的長度。
解決方案
代碼如下 |
複製代碼 |
<?php $str='a:2:{s:5:"title";s:13:"php教程分享網";s:3:"url";s:20:"http://www.111cn.net";}'; $regex = '/s\:(\d+)\:\"([^\"]+)\"/isx'; $str = preg_replace_callback( $regex , "fixser", $str); function fixser($matches) { return 's:'.strlen($matches[2]).':'.'"'.$matches[2].'"'; } ?> |
可以改成匿名函數
代碼如下 |
複製代碼 |
<?php $str='a:2:{s:5:"title";s:13:"php教程分享網";s:3:"url";s:20:"http://www.111cn.net";}'; $regex = '/s\:(\d+)\:\"([^\"]+)\"/isx'; $str = preg_replace_callback( $regex , function ($matches) { return 's:'.strlen($matches[2]).':'.'"'.$matches[2].'"'; }, $str); ?> |