diff --git a/ChangeLog b/ChangeLog
index 52d8a8efd6bd7274486dfa0126fe7325ecd1c84e..fe26708cff9f30b8cea4c8dbd1d5e33990e7a0c1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -173,8 +173,9 @@ CVS code -
 	  color_to_int(), and add a few miscellaneous tweaks.
 	- Still more steps toward full wide/multibyte character support.
 	  Make whitespace display mode work with multibyte characters,
-	  and add a few related documentation updates.  Changes to
-	  do_help(), main(), parse_rcfile(), and display_string(). (DLR)
+	  and add a few related documentation updates.  New function
+	  make_mbstring(); changes to do_help(), main(), parse_rcfile(),
+	  and display_string(). (DLR)
 - cut.c:
   do_cut_text()
 	- If keep_cutbuffer is FALSE, only blow away the text in the
diff --git a/src/chars.c b/src/chars.c
index 311208a960061bac630f1f4c13b2747c525a1bfa..e2da3ad9bf6b55eefc72529d0290fef7dd28696c 100644
--- a/src/chars.c
+++ b/src/chars.c
@@ -297,6 +297,58 @@ char *make_mbchar(int chr, char *chr_mb, int *chr_mb_len)
     return chr_mb;
 }
 
+#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
+/* Convert the string str to a valid multibyte string with the same wide
+ * character values as str.  Return the multibyte string. */
+char *make_mbstring(char *str, char *str_mb)
+{
+    assert(str != NULL && str_mb != NULL);
+
+#ifdef NANO_WIDE
+    if (!ISSET(NO_UTF8)) {
+	char *chr_mb = charalloc(MB_CUR_MAX);
+	int chr_mb_len;
+	size_t str_mb_len = 0;
+
+	str_mb = charalloc((MB_CUR_MAX * strlen(str)) + 1);
+
+	while (*str != '\0') {
+	    bool bad_char;
+	    int i;
+
+	    chr_mb_len = parse_mbchar(str, chr_mb, &bad_char, NULL);
+
+	    if (bad_char) {
+		char *bad_chr_mb = charalloc(MB_CUR_MAX);
+		int bad_chr_mb_len;
+
+		bad_chr_mb = make_mbchar((unsigned char)chr_mb[0],
+		    bad_chr_mb, &bad_chr_mb_len);
+
+		for (i = 0; i < bad_chr_mb_len; i++)
+		    str_mb[str_mb_len + i] = bad_chr_mb[i];
+		str_mb_len += bad_chr_mb_len;
+
+		free(bad_chr_mb);
+	    } else {
+		for (i = 0; i < chr_mb_len; i++)
+		    str_mb[str_mb_len + i] = chr_mb[i];
+		str_mb_len += chr_mb_len;
+	    }
+
+	    str += chr_mb_len;
+	}
+
+	free(chr_mb);
+	null_at(&str_mb, str_mb_len);
+
+	return str_mb;
+     } else
+#endif
+	return mallocstrcpy(str_mb, str);
+}
+#endif
+
 /* Parse a multibyte character from buf.  Return the number of bytes
  * used.  If chr isn't NULL, store the multibyte character in it.  If
  * bad_chr isn't NULL, set it to TRUE if we have a bad multibyte
@@ -330,6 +382,7 @@ int parse_mbchar(const char *buf, char *chr, bool *bad_chr, size_t
 	/* Save the multibyte character in chr. */
 	if (chr != NULL) {
 	    int i;
+
 	    for (i = 0; i < buf_mb_len; i++)
 		chr[i] = buf[i];
 	}
diff --git a/src/proto.h b/src/proto.h
index 3f7c30c663c2f401707da37acb8134976bfc6cdc..d0694accc4a00677e4c8986961f4395206733f82 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -175,6 +175,9 @@ wchar_t control_wrep(wchar_t c);
 int mbwidth(const char *c);
 int mb_cur_max(void);
 char *make_mbchar(int chr, char *chr_mb, int *chr_mb_len);
+#if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
+char *make_mbstring(char *str, char *str_mb);
+#endif
 int parse_mbchar(const char *buf, char *chr, bool *bad_chr, size_t
 	*col);
 size_t move_mbleft(const char *buf, size_t pos);
diff --git a/src/rcfile.c b/src/rcfile.c
index 03c30565061ab506636aa2dab2a537eee2a04cdd..5ba47f07f33a050c8871d5d2d082aa8cfc8d991e 100644
--- a/src/rcfile.c
+++ b/src/rcfile.c
@@ -570,12 +570,7 @@ void parse_rcfile(FILE *rcstream)
 #endif
 #ifndef NANO_SMALL
 			if (strcasecmp(rcopts[i].name, "whitespace") == 0) {
-			    /* We use display_string() here so that any
-			     * invalid multibyte characters in option
-			     * will be converted to valid multibyte
-			     * characters in whitespace. */
-			    whitespace = display_string(option, 0, 3, FALSE);
-
+			    whitespace = make_mbstring(option, whitespace);
 			    if (mbstrlen(whitespace) != 2 || strlenpt(whitespace) != 2) {
 				rcfile_error(N_("Two single-column characters required"));
 				free(whitespace);