Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 22133)
+++ wp-includes/functions.php	(working copy)
@@ -245,6 +245,11 @@
  * @return bool False if not serialized and true if it was.
  */
 function is_serialized( $data ) {
+	static $is_overloaded;
+
+	if ( ! isset( $is_overloaded ) )
+		$is_overloaded = ( ( ini_get( 'mbstring.func_overload' ) & 2 ) != 0 ) && function_exists( 'mb_substr' );
+
 	// if it isn't a string, it isn't serialized
 	if ( ! is_string( $data ) )
 		return false;
@@ -256,13 +261,13 @@
 		return false;
 	if ( ':' !== $data[1] )
 		return false;
-	$lastc = $data[$length-1];
+	$lastc = ( $is_overloaded ) ? substr( $data, -1 ) : $data[ $length - 1 ];
 	if ( ';' !== $lastc && '}' !== $lastc )
 		return false;
 	$token = $data[0];
 	switch ( $token ) {
 		case 's' :
-			if ( '"' !== $data[$length-2] )
+			if ( '"' !== ( ( $is_overloaded ) ? substr( $data, -2, 1 ) : $data[ $length - 2 ] ) )
 				return false;
 		case 'a' :
 		case 'O' :
@@ -284,6 +289,11 @@
  * @return bool False if not a serialized string, true if it is.
  */
 function is_serialized_string( $data ) {
+	static $is_overloaded;
+
+	if ( ! isset( $is_overloaded ) )
+		$is_overloaded = ( ( ini_get( 'mbstring.func_overload' ) & 2 ) != 0 ) && function_exists( 'mb_substr' );
+
 	// if it isn't a string, it isn't a serialized string
 	if ( !is_string( $data ) )
 		return false;
@@ -293,11 +303,11 @@
 		return false;
 	elseif ( ':' !== $data[1] )
 		return false;
-	elseif ( ';' !== $data[$length-1] )
+	elseif ( ';' !== ( ( $is_overloaded ) ? substr( $data, -1 ) : $data[ $length - 1 ] ) )
 		return false;
 	elseif ( $data[0] !== 's' )
 		return false;
-	elseif ( '"' !== $data[$length-2] )
+	elseif ( '"' !== ( ( $is_overloaded ) ? substr( $data, -2, 1 ) : $data[ $length - 2 ] ) )
 		return false;
 	else
 		return true;
