Index: wp-admin/includes/file.php
===================================================================
--- wp-admin/includes/file.php	(revision 17246)
+++ wp-admin/includes/file.php	(working copy)
@@ -356,9 +356,13 @@
 	// A writable uploads dir will pass this test. Again, there's no point overriding this one.
 	if ( ! ( ( $uploads = wp_upload_dir($time) ) && false === $uploads['error'] ) )
 		return call_user_func($upload_error_handler, $file, $uploads['error'] );
-
+		
+	// On Windows platforms, PHP will mangle characters not in the CP1251 charset, see http://bugs.php.net/bug.php?id=47096
+	if( 'WIN' == substr(PHP_OS, 0, 3) )
+		$file['name'] = iconv( get_option( 'blog_charset' ), 'Windows-1251//TRANSLIT', $file['name'] );
+		
 	$filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback );
-
+	
 	// Move the file to the uploads dir
 	$new_file = $uploads['path'] . "/$filename";
 	if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) )
