summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-01-31 21:32:04 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-01-31 21:32:04 (GMT)
commit424b07a17a900ce7a8411f524380de79cf3c4e38 (patch)
tree6439a6fb59eb0bfc7e1c82786692cdf55627cdd8
parentad36dc8b4b165bf9eb3576b42a241164e312d48c (diff)
parentdf3755888b9a54e69ab70881738d431587c57951 (diff)
downloadgit-424b07a17a900ce7a8411f524380de79cf3c4e38.zip
git-424b07a17a900ce7a8411f524380de79cf3c4e38.tar.gz
git-424b07a17a900ce7a8411f524380de79cf3c4e38.tar.bz2
Merge branch 'jc/latin-1' into maint
Some platforms no longer understand "latin-1" that is still seen in the wild in e-mail headers; replace them with "iso-8859-1" that is more widely known when conversion fails from/to it. * jc/latin-1: utf8: accept "latin-1" as ISO-8859-1 utf8: refactor code to decide fallback encoding
-rw-r--r--utf8.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/utf8.c b/utf8.c
index 00e10c8..0c8e011 100644
--- a/utf8.c
+++ b/utf8.c
@@ -489,6 +489,28 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outs
return out;
}
+static const char *fallback_encoding(const char *name)
+{
+ /*
+ * Some platforms do not have the variously spelled variants of
+ * UTF-8, so let's fall back to trying the most official
+ * spelling. We do so only as a fallback in case the platform
+ * does understand the user's spelling, but not our official
+ * one.
+ */
+ if (is_encoding_utf8(name))
+ return "UTF-8";
+
+ /*
+ * Even though latin-1 is still seen in e-mail
+ * headers, some platforms only install ISO-8859-1.
+ */
+ if (!strcasecmp(name, "latin-1"))
+ return "ISO-8859-1";
+
+ return name;
+}
+
char *reencode_string_len(const char *in, int insz,
const char *out_encoding, const char *in_encoding,
int *outsz)
@@ -501,17 +523,9 @@ char *reencode_string_len(const char *in, int insz,
conv = iconv_open(out_encoding, in_encoding);
if (conv == (iconv_t) -1) {
- /*
- * Some platforms do not have the variously spelled variants of
- * UTF-8, so let's fall back to trying the most official
- * spelling. We do so only as a fallback in case the platform
- * does understand the user's spelling, but not our official
- * one.
- */
- if (is_encoding_utf8(in_encoding))
- in_encoding = "UTF-8";
- if (is_encoding_utf8(out_encoding))
- out_encoding = "UTF-8";
+ in_encoding = fallback_encoding(in_encoding);
+ out_encoding = fallback_encoding(out_encoding);
+
conv = iconv_open(out_encoding, in_encoding);
if (conv == (iconv_t) -1)
return NULL;