PHP unserialize相关的字符串转换问题

我们先来序列化一个简单的数组

<?php
   $arr = array('ename'=>'gilbert',"name"=>"孙正斌");
  //a:2:{s:5:"ename";s:7:"gilbert";s:4:"name";s:9:"孙正斌";}
   echo serialize($arr);
?>

交待一下,我习惯在utf-8的字符集所以上面的是utf-8下出来的     我们再看一个同样的只是把脚本改为gbk

<?php
   $arr = array('ename'=>'gilbert',"name"=>"孙正斌");
   //a:2:{s:5:"ename";s:7:"gilbert";s:4:"name";s:6:"孙正斌";}
   echo serialize($arr);
?>

好我们看出了一点差别,在gbk下一个中文字符是2个字节,utf-8下是三个字节因此相同的数组序列化之后出现了不一样,通常我们会存进数据库,好吧万事大吉,通常不会出现问题。有一天我们出现了一个新的项目是utf-8编码的,我们要用到那个序列化的字符串我们反序列化时会出现问题提示一个notice错误,返回一个false;这下麻烦了,好这时我们总要解决一下问题     我们来用个函数来处理这个问题吧

<?php
    //脚本是utf-8的
    //返回false,序列化出错
        $arr = unserialize('a:2:{s:5:"ename";s:7:"gilbert";s:4:"name";s:6:"孙正斌";}');     
    //可以成功序列化返回数组
	$arr = mb_unserialize('a:2:{s:5:"ename";s:7:"gilbert";s:4:"name";s:6:"孙正斌";}');     
        //函数来自于某位的博客,忘了那位了,见谅     
	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);
    }
?>

我们可以看到主要是通过正则表达式对原序列化字符串进行重新修改,主要是修改中文字符串的长度,这对于我们把不同编码的字符串转化为当前脚本能够反序列化的字符串有很好的效果

未经允许不得转载:SuperMan's blog » PHP unserialize相关的字符串转换问题

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址