diff --git a/src/file.c b/src/file.c
index 5300e5af..239bcdcf 100644
--- a/src/file.c
+++ b/src/file.c
@@ -538,6 +538,52 @@ unwrap(struct magic_set *ms, const char *fn)
 	return e;
 }
 
+#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) && \
+   defined(HAVE_WCTYPE_H)
+/*
+ * convert string to multibyte printable format.
+ */
+private char *
+file_name_wprintable(struct magic_set *ms, char *buf, size_t bufsiz,
+    const char *str, size_t slen)
+{
+	char *ptr, *eptr = buf + bufsiz - 1;
+	size_t len = strlen(str);
+	size_t bytesconsumed;
+	mbstate_t state;
+	wchar_t nextchar;
+
+	(void)memset(&state, 0, sizeof(mbstate_t));
+
+	for (ptr = buf;  ptr < eptr && len && slen && *str; --slen) {
+		bytesconsumed = mbrtowc(&nextchar, str, len, &state);
+		if (bytesconsumed == CAST(size_t, -1) ||
+		    bytesconsumed == CAST(size_t, -2)) {
+			/* Something went wrong */
+			break;
+		}
+		if ((ms->flags & MAGIC_RAW) != 0 || iswprint(nextchar)) {
+			if (ptr >= eptr - bytesconsumed) {
+				break;
+			}
+			memcpy(ptr, str, bytesconsumed);
+			ptr += bytesconsumed;
+		} else {
+			if (ptr >= eptr - 3)
+				break;
+			*ptr++ = '\\';
+			*ptr++ = ((CAST(unsigned int, *str) >> 6) & 7) + '0';
+			*ptr++ = ((CAST(unsigned int, *str) >> 3) & 7) + '0';
+			*ptr++ = ((CAST(unsigned int, *str) >> 0) & 7) + '0';
+		}
+		str += bytesconsumed;
+		len -= bytesconsumed;
+	}
+	*ptr = '\0';
+	return buf;
+}
+#endif
+
 /*
  * Called for each input file on the command line (or in a list of files)
  */
@@ -554,7 +600,12 @@ process(struct magic_set *ms, const char *inname, int wid)
 	    file_err(EXIT_FAILURE, "Can't allocate %zu bytes", plen);
 
 	if (wid > 0 && !bflag) {
+#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH) && \
+   defined(HAVE_WCTYPE_H)
+		pname = file_name_wprintable(ms, pbuf, plen, inname, wid);
+#else
 		pname = file_printable(ms, pbuf, plen, inname, wid);
+#endif
 		(void)printf("%s", std_in ? "/dev/stdin" : pname);
 		if (nulsep)
 			(void)putc('\0', stdout);
