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 399438fe775dc8751bde89905f42048ade3c9f3d..955437f2c1c37b09c146d59643d9ac639b19c501 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/port/chklocale.c,v 1.1 2007/09/28 22:25:49 tgl Exp $
+ *       $PostgreSQL: pgsql/src/port/chklocale.c,v 1.2 2007/09/28 23:36:06 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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.