diff --git a/ChangeLog b/ChangeLog
index a79a4fca4e8ff0a0da11c5b36c4d6651e7bf33df..2321bc7afce69e8486ec73b1e4e2c8dbccf1885c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -146,6 +146,10 @@ CVS code -
 	- Treat the Unicode characters D800-DFFF and FFFE-FFFF as
 	  invalid, since the C library's multibyte functions don't seem
 	  to. (DLR)
+  make_mbchar()
+	- Treat the Unicode characters D800-DFFF and FFFE-FFFF as
+	  invalid, since the C library's multibyte functions don't seem
+	  to. (DLR)
   parse_mbchar()
 	- Remove now-unneeded bad_chr parameter. (DLR)
   mbstrchr()
diff --git a/src/chars.c b/src/chars.c
index dff80d843448eafa06daab288031c065f1e2a3da..f21b9d6f4886131655d338720ff7991b9d7b72f5 100644
--- a/src/chars.c
+++ b/src/chars.c
@@ -333,7 +333,10 @@ char *make_mbchar(int chr, int *chr_mb_len)
 	chr_mb = charalloc(MB_CUR_MAX);
 	*chr_mb_len = wctomb(chr_mb, chr);
 
-	if (*chr_mb_len < 0) {
+	/* Unicode D800-DFFF and FFFE-FFFF are invalid, even though
+	 * they're parsed properly. */
+	if (*chr_mb_len < 0 || ((0xD800 <= chr && chr <= 0xDFFF) ||
+		(0XFFFE <= chr && chr <= 0xFFFF))) {
 	    wctomb(NULL, 0);
 	    *chr_mb_len = 0;
 	}