diff --git a/src/utils.c b/src/utils.c
index 4e8c428093518ede31b08fdf284221741dbc98ec..8fd711869af0dda57075f9adc757ee6e2064c705 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -2,7 +2,7 @@
 /**************************************************************************
  *   utils.c                                                              *
  *                                                                        *
- *   Copyright (C) 1999-2004 Chris Allegretta                             *
+ *   Copyright (C) 1999-2005 Chris Allegretta                             *
  *   This program is free software; you can redistribute it and/or modify *
  *   it under the terms of the GNU General Public License as published by *
  *   the Free Software Foundation; either version 2, or (at your option)  *
@@ -188,16 +188,24 @@ int parse_char(const char *str, int *chr, size_t *col
 		(*col)++;
 		wide_str = control_rep((unsigned char)wide_str);
 
-		if (wctomb(ctrl_wide_str, (wchar_t)wide_str) != -1)
-		    *col += wcwidth(wide_str);
+		if (wctomb(ctrl_wide_str, (wchar_t)wide_str) != -1) {
+		    int width = wcwidth(wide_str);
+
+		    if (width != -1)
+			*col += width;
+		}
 		else
 		    (*col)++;
 
 		free(ctrl_wide_str);
 	    /* If we have a normal character, get its width in columns
 	     * normally. */
-	    } else
-		*col += wcwidth(wide_str);
+	    } else {
+		int width = wcwidth(wide_str);
+
+		if (width != -1)
+		    *col += width;
+	    }
 	}
     } else {
 #endif
diff --git a/src/winio.c b/src/winio.c
index 0c5cf624ae7108ffa8d041558ee124fa301406f5..1378d3a53d0382eb1a5657604b723e0af1add167 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -2119,8 +2119,6 @@ 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 {
@@ -2242,15 +2240,10 @@ 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);
-
-		    if (ctrl_wide_buf_len == -1) {
-			ctrl_wide_buf_len = 1;
-			ctrl_wide_buf[0] = ' ';
-		    }
-		} else {
+		else {
 #endif
 		    ctrl_wide_buf_len = 1;
 		    ctrl_wide_buf[0] = (unsigned char)wide_buf;
@@ -2263,10 +2256,21 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 
 		free(ctrl_wide_buf);
 
-		start_col++;
+#ifdef NANO_WIDE
+		if (!ISSET(NO_UTF8)) {
+		    int width = wcwidth((wchar_t)wide_buf);
+
+		    if (width != -1)
+			start_col += width;
+		} else
+#endif
+		    start_col++;
+
 		start_index += wide_buf_len;
 	    }
-	} else if (wcwidth(wide_buf) > 1) {
+	}
+#ifdef NANO_WIDE
+	else if (wcwidth((wchar_t)wide_buf) > 1) {
 	    /* If dollars is TRUE, make room for the "$" at the
 	     * beginning of the line.  Also make sure that we don't try
 	     * to display only part of a multicolumn character there. */
@@ -2280,6 +2284,7 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 	    start_col++;
 	    start_index += wide_buf_len;
 	}
+#endif
     }
 
     while (index < alloc_len && buf[start_index] != '\0') {
@@ -2321,15 +2326,10 @@ 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);
-
-		if (ctrl_wide_buf_len == -1) {
-		    ctrl_wide_buf_len = 1;
-		    ctrl_wide_buf[0] = ' ';
-		}
-	    } else {
+	    else {
 #endif
 		ctrl_wide_buf_len = 1;
 		ctrl_wide_buf[0] = (unsigned char)wide_buf;
@@ -2342,11 +2342,15 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 
 	    free(ctrl_wide_buf);
 
-	    start_col +=
 #ifdef NANO_WIDE
-		!ISSET(NO_UTF8) ? wcwidth((wchar_t)wide_buf) :
+	    if (!ISSET(NO_UTF8)) {
+		int width = wcwidth((wchar_t)wide_buf);
+
+		if (width != -1)
+		    start_col += width;
+	    } else
 #endif
-		1;
+		start_col++;
 	} else if (wide_buf == ' ') {
 	    converted[index++] =
 #if !defined(NANO_SMALL) && defined(ENABLE_NANORC)
@@ -2368,11 +2372,6 @@ 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];
 
@@ -2384,9 +2383,12 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
 #ifdef NANO_WIDE
 	    }
 
-	    if (!ISSET(NO_UTF8))
-		start_col += wcwidth((wchar_t)wide_buf);
-	    else
+	    if (!ISSET(NO_UTF8)) {
+		int width = wcwidth((wchar_t)wide_buf);
+
+		if (width != -1)
+		    start_col += width;
+	    } else
 #endif
 		start_col++;
 	}