关于php在unserialize时返回false

今天碰到一个很畸形的问题,在进行反序列化时,结果返回了false,仔细检查了下,原来是序列化时编码与反序列化时编码问题。

平时很少注意这个,原因是编码不一致时单引号和双引号有差别。

以下函数进行替换可解决此问题。

// UTF-8
function mb_unserialize($serial_str) {
	$serial_str = str_replace ( "\r", "", $serial_str );
	$serial_str = preg_replace ( '!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
	return unserialize ( $serial_str );
}

// ASC
function asc_unserialize($serial_str) {
	$serial_str = str_replace ( "\r", "", $serial_str );
	$serial_str = preg_replace ( '!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str );
	return unserialize ( $serial_str );
}