diff --git a/src/winio.c b/src/winio.c
index dabf213dc0f8344f9342bf5315642c7c6aaf8445..d116b89960a6727a93a9487cdcb046c8bd3c3077 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -1769,6 +1769,8 @@ size_t display_string_len(const char *buf, size_t start_col, size_t
 
 	    if (bad_wide_buf_len != -1)
 		retval += bad_wide_buf_len;
+	    else
+		retval++;
 
 	    free(bad_wide_buf);
 	} else {
@@ -1809,7 +1811,10 @@ size_t display_string_len(const char *buf, size_t start_col, size_t
 
 		free(bad_wide_buf);
 
-		retval += bad_wide_buf_len;
+		if (bad_wide_buf_len != -1)
+		    retval += bad_wide_buf_len;
+		else
+		    retval++;
 	    } else
 #endif
 		retval += wide_buf_len;
@@ -1887,10 +1892,15 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 		wide_buf = control_rep((unsigned char)wide_buf);
 
 #ifdef NANO_WIDE
-		if (!ISSET(NO_UTF8))
+		if (!ISSET(NO_UTF8)) {
 		    ctrl_wide_buf_len = wctomb(ctrl_wide_buf,
 			(wchar_t)wide_buf);
-		else {
+
+		    if (ctrl_wide_buf_len == -1) {
+			ctrl_wide_buf_len = 1;
+			ctrl_wide_buf[0] = ' ';
+		    }
+		} else {
 #endif
 		    ctrl_wide_buf_len = 1;
 		    ctrl_wide_buf[0] = (unsigned char)wide_buf;
@@ -1961,10 +1971,15 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 	    wide_buf = control_rep((unsigned char)wide_buf);
 
 #ifdef NANO_WIDE
-	    if (!ISSET(NO_UTF8))
+	    if (!ISSET(NO_UTF8)) {
 		ctrl_wide_buf_len = wctomb(ctrl_wide_buf,
 			(wchar_t)wide_buf);
-	    else {
+
+		if (ctrl_wide_buf_len == -1) {
+		    ctrl_wide_buf_len = 1;
+		    ctrl_wide_buf[0] = ' ';
+		}
+	    } else {
 #endif
 		ctrl_wide_buf_len = 1;
 		ctrl_wide_buf[0] = (unsigned char)wide_buf;
@@ -2003,6 +2018,11 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 		bad_wide_buf_len = wctomb(bad_wide_buf,
 			(wchar_t)wide_buf);
 
+		if (bad_wide_buf_len == -1) {
+		    bad_wide_buf_len = 1;
+		    bad_wide_buf[0] = ' ';
+		}
+
 		for (i = 0; i < bad_wide_buf_len; i++)
 		    converted[index++] = bad_wide_buf[i];