diff --git a/builtin-branch.c b/builtin-branch.c
index 5f5c1823cb2..c1e9a61ea56 100644
--- a/builtin-branch.c
+++ b/builtin-branch.c
@@ -276,7 +276,7 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose,
 		if (commit && !parse_commit(commit)) {
 			pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
 					    &subject, &subject_len, 0,
-					    NULL, NULL, 0);
+					    NULL, NULL, 0, 0);
 			sub = subject;
 		}
 		printf("%c %s%-*s%s %s %s\n", c, branch_get_color(color),
diff --git a/builtin-log.c b/builtin-log.c
index c6cc3aef527..070886ae578 100644
--- a/builtin-log.c
+++ b/builtin-log.c
@@ -795,7 +795,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)
 			char *buf = NULL;
 			unsigned long buflen = 0;
 			pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
-			                    &buf, &buflen, 0, NULL, NULL, 0);
+			                    &buf, &buflen, 0, NULL, NULL, 0, 0);
 			printf("%c %s %s\n", sign,
 			       sha1_to_hex(commit->object.sha1), buf);
 			free(buf);
diff --git a/builtin-rev-list.c b/builtin-rev-list.c
index ac551d59f3f..9dbfae416c2 100644
--- a/builtin-rev-list.c
+++ b/builtin-rev-list.c
@@ -84,7 +84,7 @@ static void show_commit(struct commit *commit)
 		unsigned long buflen = 0;
 		pretty_print_commit(revs.commit_format, commit, ~0,
 				    &buf, &buflen,
-				    revs.abbrev, NULL, NULL, revs.date_mode);
+				    revs.abbrev, NULL, NULL, revs.date_mode, 0);
 		printf("%s%c", buf, hdr_termination);
 		free(buf);
 	}
diff --git a/builtin-show-branch.c b/builtin-show-branch.c
index 4fa87f6081f..b9cf1b379f6 100644
--- a/builtin-show-branch.c
+++ b/builtin-show-branch.c
@@ -267,7 +267,7 @@ static void show_one_commit(struct commit *commit, int no_name)
 	if (commit->object.parsed) {
 		pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
 				    &pretty, &pretty_len,
-				    0, NULL, NULL, 0);
+				    0, NULL, NULL, 0, 0);
 		pretty_str = pretty;
 	}
 	if (!prefixcmp(pretty_str, "[PATCH] "))
diff --git a/commit.c b/commit.c
index 1fbdd2d51b8..10f7b14e763 100644
--- a/commit.c
+++ b/commit.c
@@ -479,7 +479,7 @@ static int get_one_line(const char *msg, unsigned long len)
 }
 
 /* High bit set, or ISO-2022-INT */
-static int non_ascii(int ch)
+int non_ascii(int ch)
 {
 	ch = (ch & 0xff);
 	return ((ch & 0x80) || (ch == 0x1b));
@@ -1158,13 +1158,13 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt,
 				  char **buf_p, unsigned long *space_p,
 				  int abbrev, const char *subject,
 				  const char *after_subject,
-				  enum date_mode dmode)
+				  enum date_mode dmode,
+				  int plain_non_ascii)
 {
 	unsigned long offset = 0;
 	unsigned long beginning_of_body;
 	int indent = 4;
 	const char *msg = commit->buffer;
-	int plain_non_ascii = 0;
 	char *reencoded;
 	const char *encoding;
 	char *buf;
diff --git a/commit.h b/commit.h
index 467872eecab..b897b5730d9 100644
--- a/commit.h
+++ b/commit.h
@@ -60,8 +60,9 @@ enum cmit_fmt {
 	CMIT_FMT_UNSPECIFIED,
 };
 
+extern int non_ascii(int);
 extern enum cmit_fmt get_commit_format(const char *arg);
-extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *, unsigned long len, char **buf_p, unsigned long *space_p, int abbrev, const char *subject, const char *after_subject, enum date_mode dmode);
+extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *, unsigned long len, char **buf_p, unsigned long *space_p, int abbrev, const char *subject, const char *after_subject, enum date_mode dmode, int non_ascii_present);
 
 /** Removes the first commit from a list sorted by date, and adds all
  * of its parents.
diff --git a/log-tree.c b/log-tree.c
index b509c0c7ec2..9ebc24b6875 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -140,6 +140,18 @@ static unsigned int digits_in_number(unsigned int number)
 	return result;
 }
 
+static int has_non_ascii(const char *s)
+{
+	int ch;
+	if (!s)
+		return 0;
+	while ((ch = *s++) != '\0') {
+		if (non_ascii(ch))
+			return 1;
+	}
+	return 0;
+}
+
 void show_log(struct rev_info *opt, const char *sep)
 {
 	char *msgbuf = NULL;
@@ -290,7 +302,8 @@ void show_log(struct rev_info *opt, const char *sep)
 	 */
 	len = pretty_print_commit(opt->commit_format, commit, ~0u,
 				  &msgbuf, &msgbuf_len, abbrev, subject,
-				  extra_headers, opt->date_mode);
+				  extra_headers, opt->date_mode,
+				  has_non_ascii(opt->add_signoff));
 
 	if (opt->add_signoff)
 		len = append_signoff(&msgbuf, &msgbuf_len, len,
diff --git a/t/t4021-format-patch-signer-mime.sh b/t/t4021-format-patch-signer-mime.sh
new file mode 100755
index 00000000000..67a70fadabb
--- /dev/null
+++ b/t/t4021-format-patch-signer-mime.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+test_description='format-patch -s should force MIME encoding as needed'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+	>F &&
+	git add F &&
+	git commit -m initial &&
+	echo new line >F &&
+
+	test_tick &&
+	git commit -m "This adds some lines to F" F
+
+'
+
+test_expect_success 'format normally' '
+
+	git format-patch --stdout -1 >output &&
+	! grep Content-Type output
+
+'
+
+test_expect_success 'format with signoff without funny signer name' '
+
+	git format-patch -s --stdout -1 >output &&
+	! grep Content-Type output
+
+'
+
+test_expect_success 'format with non ASCII signer name' '
+
+	GIT_COMMITTER_NAME="はまの ふにおう瘢雹" \
+	git format-patch -s --stdout -1 >output &&
+	grep Content-Type output
+
+'
+
+test_done
+