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.