PHP unserialize fails with non-encoded characters?

后端 未结 14 1580
遥遥无期
遥遥无期 2020-11-27 16:13
$ser = \'a:2:{i:0;s:5:\"héllö\";i:1;s:5:\"wörld\";}\'; // fails
$ser2 = \'a:2:{i:0;s:5:\"hello\";i:1;s:5:\"world\";}\'; // works
$out = unserialize($ser);
$out2 = un         


        
相关标签:
14条回答
  • 2020-11-27 16:44

    we can break the string down to an array:

    $finalArray = array();
    $nodeArr = explode('&', $_POST['formData']);
    
    foreach($nodeArr as $value){
        $childArr = explode('=', $value);
        $finalArray[$childArr[0]] = $childArr[1];
    }
    
    0 讨论(0)
  • 2020-11-27 16:45
    /**
     * MULIT-BYTE UNSERIALIZE
     *
     * UTF-8 will screw up a serialized string
     *
     * @param string
     * @return string
     */
    function mb_unserialize($string) {
        $string = preg_replace_callback('/!s:(\d+):"(.*?)";!se/', function($matches) { return 's:'.strlen($matches[1]).':"'.$matches[1].'";'; }, $string);
        return unserialize($string);
    }
    
    0 讨论(0)
  • 2020-11-27 16:50

    I would advise you to use javascript to encode as json and then use json_decode to unserialize.

    0 讨论(0)
  • 2020-11-27 16:57

    Lionel Chan answer modified to work with PHP >= 5.5 :

    function mb_unserialize($string) {
        $string2 = preg_replace_callback(
            '!s:(\d+):"(.*?)";!s',
            function($m){
                $len = strlen($m[2]);
                $result = "s:$len:\"{$m[2]}\";";
                return $result;
    
            },
            $string);
        return unserialize($string2);
    }    
    

    This code uses preg_replace_callback as preg_replace with the /e modifier is obsolete since PHP 5.5.

    0 讨论(0)
  • 2020-11-27 16:57

    Do not use PHP serialization/unserialization when the other end is not PHP. It is not meant to be a portable format - for example, it even includes ascii-1 characters for protected keys which is nothing you want to deal with in javascript (even though it would work perfectly fine, it's just extremely ugly).

    Instead, use a portable format like JSON. XML would do the job, too, but JSON has less overhead and is more programmer-friendly as you can easily parse it into a simple data structure instead of having to deal with XPath, DOM trees etc.

    0 讨论(0)
  • 2020-11-27 16:58

    The issue is - as pointed out by Alix - related to encoding.

    Until PHP 5.4 the internal encoding for PHP was ISO-8859-1, this encoding uses a single byte for some characters that in unicode are multibyte. The result is that multibyte values serialized on UTF-8 system will not be readable on ISO-8859-1 systems.

    The avoid problems like this make sure all systems use the same encoding:

    mb_internal_encoding('utf-8');
    $arr = array('foo' => 'bár');
    $buf = serialize($arr);
    

    You can use utf8_(encode|decode) to cleanup:

    // Set system encoding to iso-8859-1
    mb_internal_encoding('iso-8859-1');
    $arr = unserialize(utf8_encode($serialized));
    print_r($arr);
    
    0 讨论(0)
提交回复
热议问题