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;