diff -r a8003c55a83e mbyte.c --- a/mbyte.c Wed Mar 1 11:02:27 2006 +++ b/mbyte.c Sat Mar 4 23:44:29 2006 @@ -469,3 +469,36 @@ { return Charset_is_utf8 ? 0xfffd : '?'; } + +int mutt_filter_unprintable (char **s) +{ + BUFFER *b = NULL; + wchar_t wc; + size_t k, k2; + char scratch[MB_LEN_MAX + 1]; + char *p = *s; + mbstate_t mbstate1, mbstate2; + + if (!(b = mutt_buffer_init (b))) + return -1; + memset (&mbstate1, 0, sizeof (mbstate1)); + memset (&mbstate2, 0, sizeof (mbstate2)); + for (; (k = mbrtowc (&wc, p, MB_LEN_MAX, &mbstate1)); p += k) + { + if (k == (size_t)(-1) || k == (size_t)(-2)) + { + k = 1; + wc = replacement_char(); + } + if (!IsWPrint (wc)) + wc = '?'; + k2 = wcrtomb (scratch, wc, &mbstate2); + scratch[k2] = '\0'; + mutt_buffer_addstr (b, scratch); + } + FREE (s); + *s = b->data; + FREE (&b); + return 0; +} + diff -r a8003c55a83e protos.h --- a/protos.h Wed Mar 1 11:02:27 2006 +++ b/protos.h Sat Mar 4 23:44:29 2006 @@ -181,6 +181,7 @@ void mutt_edit_content_type (HEADER *, BODY *, FILE *); void mutt_edit_file (const char *, const char *); void mutt_edit_headers (const char *, const char *, HEADER *, char *, size_t); +int mutt_filter_unprintable (char **); void mutt_curses_error (const char *, ...); void mutt_curses_message (const char *, ...); void mutt_enter_command (void); diff -r a8003c55a83e rfc2047.c --- a/rfc2047.c Wed Mar 1 11:02:27 2006 +++ b/rfc2047.c Sat Mar 4 23:44:29 2006 @@ -705,6 +705,7 @@ if (charset) mutt_convert_string (&d0, charset, Charset, M_ICONV_HOOK_FROM); + mutt_filter_unprintable (&d0); strfcpy (d, d0, len); FREE (&charset); FREE (&d0); diff -r a8003c55a83e rfc2231.c --- a/rfc2231.c Wed Mar 1 11:02:27 2006 +++ b/rfc2231.c Sat Mar 4 23:44:29 2006 @@ -131,6 +131,7 @@ s = rfc2231_get_charset (p->value, charset, sizeof (charset)); rfc2231_decode_one (p->value, s); mutt_convert_string (&p->value, charset, Charset, M_ICONV_HOOK_FROM); + mutt_filter_unprintable (&p->value); *last = p; last = &p->next;