utf8: refactor code to decide fallback encoding

The codepath we use to call iconv_open() has a provision to use a fallback encoding when it fails, hoping that "UTF-8" being spelled differently could be the reason why the library function did not like the encoding names we gave it. Essentially, we turn what we have observed to be used as variants of "UTF-8" (e.g. "utf8") into the most official spelling and use that as a fallback. We do the same thing for input and output encoding. Introduce a helper function to do just one side and call that twice. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Sep 26, 2016 at 18:09 UTC 3270741ea8c2a225183d272bf19ea19d5b3c05d8
1 file changed +18 -11
utf8.c
+18 -11
@@ -489,6 +489,21 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outs
489 return out;
490 }
491
492 +static const char *fallback_encoding(const char *name)
493 +{
494 + /*
495 + * Some platforms do not have the variously spelled variants of
496 + * UTF-8, so let's fall back to trying the most official
497 + * spelling. We do so only as a fallback in case the platform
498 + * does understand the user's spelling, but not our official
499 + * one.
500 + */
501 + if (is_encoding_utf8(name))
502 + return "UTF-8";
503 +
504 + return name;
505 +}
506 +
507 char *reencode_string_len(const char *in, int insz,
508 const char *out_encoding, const char *in_encoding,
509 int *outsz)
@@ -501,17 +516,9 @@ char *reencode_string_len(const char *in, int insz,
516
517 conv = iconv_open(out_encoding, in_encoding);
518 if (conv == (iconv_t) -1) {
504 - /*
505 - * Some platforms do not have the variously spelled variants of
506 - * UTF-8, so let's fall back to trying the most official
507 - * spelling. We do so only as a fallback in case the platform
508 - * does understand the user's spelling, but not our official
509 - * one.
510 - */
511 - if (is_encoding_utf8(in_encoding))
512 - in_encoding = "UTF-8";
513 - if (is_encoding_utf8(out_encoding))
514 - out_encoding = "UTF-8";
519 + in_encoding = fallback_encoding(in_encoding);
520 + out_encoding = fallback_encoding(out_encoding);
521 +
522 conv = iconv_open(out_encoding, in_encoding);
523 if (conv == (iconv_t) -1)
524 return NULL;