summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2007-09-28 23:36:06 +0000
committerTom Lane2007-09-28 23:36:06 +0000
commitc7bafa75d3d7fdb4e3642784091060d7f2f23791 (patch)
tree4f7b462b30e5cfc043103f8b801f543478399dbc
parentbbbcb03f95e4a10c244c8cf1882025e6a8cd05f2 (diff)
On OS X, assume that an empty-string result for nl_langinfo(CODESET)
means UTF-8. Per examination of /usr/share/locale in 10.4.10.
-rw-r--r--src/port/chklocale.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/port/chklocale.c b/src/port/chklocale.c
index 92bf4db2b5..10658c78bb 100644
--- a/src/port/chklocale.c
+++ b/src/port/chklocale.c
@@ -158,6 +158,7 @@ pg_get_encoding_from_locale(const char *ctype)
char *sys;
int i;
+ /* Get the CODESET property, and also LC_CTYPE if not passed in */
if (ctype)
{
char *save;
@@ -197,12 +198,14 @@ pg_get_encoding_from_locale(const char *ctype)
if (!sys)
return PG_SQL_ASCII; /* out of memory; unlikely */
+ /* If locale is C or POSIX, we can allow all encodings */
if (pg_strcasecmp(ctype, "C") == 0 || pg_strcasecmp(ctype, "POSIX") == 0)
{
free(sys);
return PG_SQL_ASCII;
}
+ /* Check the table */
for (i = 0; encoding_match_list[i].system_enc_name; i++)
{
if (pg_strcasecmp(sys, encoding_match_list[i].system_enc_name) == 0)
@@ -212,6 +215,20 @@ pg_get_encoding_from_locale(const char *ctype)
}
}
+ /* Special-case kluges for particular platforms go here */
+
+#ifdef __darwin__
+ /*
+ * Current OS X has many locales that report an empty string for CODESET,
+ * but they all seem to actually use UTF-8.
+ */
+ if (strlen(sys) == 0)
+ {
+ free(sys);
+ return PG_UTF8;
+ }
+#endif
+
/*
* We print a warning if we got a CODESET string but couldn't recognize
* it. This means we need another entry in the table.