diff --git src/wp-admin/includes/file.php src/wp-admin/includes/file.php
index da215b7a14..8f26ba685c 100644
--- src/wp-admin/includes/file.php
+++ src/wp-admin/includes/file.php
@@ -824,7 +824,16 @@ function _wp_handle_upload( &$file, $overrides, $time, $action ) {
 		return call_user_func_array( $upload_error_handler, array( &$file, $uploads['error'] ) );
 	}
 
-	$filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback );
+	$tmp_file_name = $file['name'];
+	$ext           = pathinfo( $tmp_file_name, PATHINFO_EXTENSION );
+	$name          = wp_basename( $tmp_file_name, ".$ext" );
+
+	// Change file name to be hashed if it contains multi-byte chars.
+	if ( ! is_ascii_text( $name ) ) {
+		$tmp_file_name = md5( $name ) . ".$ext";
+	}
+
+	$filename = wp_unique_filename( $uploads['path'], $tmp_file_name, $unique_filename_callback );
 
 	// Move the file to the uploads dir.
 	$new_file = $uploads['path'] . "/$filename";
diff --git src/wp-includes/formatting.php src/wp-includes/formatting.php
index bf03e78e1e..53cba60dfa 100644
--- src/wp-includes/formatting.php
+++ src/wp-includes/formatting.php
@@ -5057,6 +5057,21 @@ function sanitize_text_field( $str ) {
 	return apply_filters( 'sanitize_text_field', $filtered, $str );
 }
 
+/**
+ * Check if it has only ASCII characters or not.
+ *
+ * @since 5.0.0
+ * @param string $str Strings that may contain none-ASCII chars.
+ * @return bool Return true if $str is ASCII text.
+ */
+function is_ascii_text( $str ) {
+	if ( preg_match( '/^[\\x{0000}-\\x{007F}]+$/u', $str, $match ) ) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
 /**
  * Sanitizes a multiline string from user input or from the database.
  *
diff --git tests/phpunit/tests/formatting/FileName.php tests/phpunit/tests/formatting/FileName.php
new file mode 100644
index 0000000000..2abc32cf46
--- /dev/null
+++ tests/phpunit/tests/formatting/FileName.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @group formatting
+ */
+class Tests_Formatting_FileName extends WP_UnitTestCase {
+	/**
+	 * Check if it contains none-ASCII character or not.
+	 */
+	function test_contains_ascii_chars() {
+		$ascii_text = 'Welcome to WordPress.';
+		$this->assertTrue( is_ascii_text( $ascii_text ) );
+
+		$none_ascii_text = 'WordPressへようこそ';
+		$this->assertFalse( is_ascii_text( $none_ascii_text ) );
+	}
+}
