We rely on ASCII everywhere. We print "\n" directly without conversion for example. The end result would be a mix of some encoding and ASCII if they are incompatible. Do not do that. In theory we could convert everything to utf-8 as intermediate medium, process process process, then convert final output to the desired encoding. But that's a lot of work (unless we have a pager-like converter) with little real use. Users can just pipe everything to iconv instead. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- It seems half of the encodings "iconv -l" list does not pass ascii_superset_encoding() test. I just assume they are either exotic or duplicate names. pretty.c | 7 +++++++ utf8.c | 15 +++++++++++++++ utf8.h | 1 + 3 files changed, 23 insertions(+), 0 deletions(-) diff --git a/pretty.c b/pretty.c index 8688b8f..5c433a2 100644 --- a/pretty.c +++ b/pretty.c @@ -493,12 +493,19 @@ char *logmsg_reencode(const struct commit *commit, const char *output_encoding) { static const char *utf8 = "UTF-8"; + static const char *last_output_encoding = NULL; const char *use_encoding; char *encoding; char *out; if (!*output_encoding) return NULL; + if (last_output_encoding != output_encoding) { + if (!ascii_superset_encoding(output_encoding)) + die("encoding %s is not a superset of ASCII.", + output_encoding); + last_output_encoding = output_encoding; + } encoding = get_header(commit, "encoding"); use_encoding = encoding ? encoding : utf8; if (!strcmp(use_encoding, output_encoding)) diff --git a/utf8.c b/utf8.c index 8acbc66..def93ee 100644 --- a/utf8.c +++ b/utf8.c @@ -482,3 +482,18 @@ char *reencode_string(const char *in, const char *out_encoding, const char *in_e return out; } #endif + +int ascii_superset_encoding(const char *encoding) +{ + const char *sample = " !\"#$%&'()*+,-./0123456789:;<=>?@" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`" + "abcdefghijklmnopqrstuvwxyz{|}~\n"; + char *output; + int ret; + if (!encoding) + return 1; + output = reencode_string(sample, encoding, "US-ASCII"); + ret = !output || !strcmp(sample, output); + free(output); + return ret; +} diff --git a/utf8.h b/utf8.h index 81f2c82..75bc128 100644 --- a/utf8.h +++ b/utf8.h @@ -12,6 +12,7 @@ int strbuf_add_wrapped_text(struct strbuf *buf, const char *text, int indent, int indent2, int width); int strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len, int indent, int indent2, int width); +int ascii_superset_encoding(const char *encoding); #ifndef NO_ICONV char *reencode_string(const char *in, const char *out_encoding, const char *in_encoding); -- 1.7.8.36.g69ee2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html