On OS X, assume that an empty-string result for nl_langinfo(CODESET)
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 28 Sep 2007 23:36:06 +0000 (23:36 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 28 Sep 2007 23:36:06 +0000 (23:36 +0000)
means UTF-8.  Per examination of /usr/share/locale in 10.4.10.

src/port/chklocale.c

index 92bf4db2b59ee61f48b94183ce5408a028af9fd7..10658c78bba0adba2a4382562bb2874107a7fc11 100644 (file)
@@ -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.