Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 21088)
+++ wp-includes/post.php	(working copy)
@@ -2849,12 +2849,13 @@
 
 		if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ) ) {
 			$suffix = 2;
+			$slug = urldecode( $slug );
 			do {
-				$alt_post_name = substr ($slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
+				$alt_post_name = mb_substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
 				$post_name_check = $wpdb->get_var( $wpdb->prepare($check_sql, $alt_post_name, $post_ID ) );
 				$suffix++;
 			} while ( $post_name_check );
-			$slug = $alt_post_name;
+			$slug = urlencode( $alt_post_name );
 		}
 	} elseif ( in_array( $post_type, $hierarchical_post_types ) ) {
 		// Page slugs must be unique within their own trees. Pages are in a separate
@@ -2864,12 +2865,13 @@
 
 		if ( $post_name_check || in_array( $slug, $feeds ) || preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug )  || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) {
 			$suffix = 2;
+			$slug = urldecode( $slug );
 			do {
-				$alt_post_name = substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
+				$alt_post_name = mb_substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
 				$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID, $post_parent ) );
 				$suffix++;
 			} while ( $post_name_check );
-			$slug = $alt_post_name;
+			$slug = urlencode( $alt_post_name );
 		}
 	} else {
 		// Post slugs must be unique across all posts.
@@ -2878,12 +2880,13 @@
 
 		if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) {
 			$suffix = 2;
+			$slug = urldecode( $slug );
 			do {
-				$alt_post_name = substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
+				$alt_post_name = mb_substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
 				$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID ) );
 				$suffix++;
 			} while ( $post_name_check );
-			$slug = $alt_post_name;
+			$slug = urlencode( $alt_post_name );
 		}
 	}
 
