Re: Re: [COMMITTERS] pgsql: Explicitly bind gettext() to the UTF8 locale when in use. - Mailing list pgsql-hackers

From Magnus Hagander
Subject Re: Re: [COMMITTERS] pgsql: Explicitly bind gettext() to the UTF8 locale when in use.
Date
Msg-id 49772466.4090107@hagander.net
Whole thread Raw
In response to Re: Re: [COMMITTERS] pgsql: Explicitly bind gettext() to the UTF8 locale when in use.  (Peter Eisentraut <peter_e@gmx.net>)
Responses Re: Re: [COMMITTERS] pgsql: Explicitly bind gettext() to the UTF8 locale when in use.  (Peter Eisentraut <peter_e@gmx.net>)
Re: Re: [COMMITTERS] pgsql: Explicitly bind gettext() to the UTF8 locale when in use.  (Hiroshi Inoue <inoue@tpf.co.jp>)
List pgsql-hackers
Peter Eisentraut wrote:
> Magnus Hagander wrote:
>> However, one question: The comment currently says it's harmless to do
>> this on non-windows platforms. Does this still hold true?
>
> Yes, the non-WIN32 code path appears to be the same, still.  But the
> ifdef WIN32 part we don't want, because that presumes something about
> the spelling of encoding names in the local iconv library.
>
>> If we do keep the thing win32 only, I think we should just wrap the
>> whole thing in #ifdef WIN32 and no longer do the codeset stuff at all on
>> Unix - that'll make for cleaner code.
>
> Yes, that would be much better.

Something like this then?

//Magnus

*** a/src/backend/utils/mb/mbutils.c
--- b/src/backend/utils/mb/mbutils.c
***************
*** 849,854 **** cliplen(const char *str, int len, int limit)
--- 849,894 ----
      return l;
  }

+ #if defined(ENABLE_NLS) && defined(WIN32)
+ static const struct codeset_map {
+     int    encoding;
+     const char *codeset;
+ } codeset_map_array[] = {
+     {PG_UTF8, "UTF-8"},
+     {PG_LATIN1, "LATIN1"},
+     {PG_LATIN2, "LATIN2"},
+     {PG_LATIN3, "LATIN3"},
+     {PG_LATIN4, "LATIN4"},
+     {PG_ISO_8859_5, "ISO-8859-5"},
+     {PG_ISO_8859_6, "ISO_8859-6"},
+     {PG_ISO_8859_7, "ISO-8859-7"},
+     {PG_ISO_8859_8, "ISO-8859-8"},
+     {PG_LATIN5, "LATIN5"},
+     {PG_LATIN6, "LATIN6"},
+     {PG_LATIN7, "LATIN7"},
+     {PG_LATIN8, "LATIN8"},
+     {PG_LATIN9, "LATIN-9"},
+     {PG_LATIN10, "LATIN10"},
+     {PG_KOI8R, "KOI8-R"},
+     {PG_WIN1250, "CP1250"},
+     {PG_WIN1251, "CP1251"},
+     {PG_WIN1252, "CP1252"},
+     {PG_WIN1253, "CP1253"},
+     {PG_WIN1254, "CP1254"},
+     {PG_WIN1255, "CP1255"},
+     {PG_WIN1256, "CP1256"},
+     {PG_WIN1257, "CP1257"},
+     {PG_WIN1258, "CP1258"},
+     {PG_WIN866, "CP866"},
+     {PG_WIN874, "CP874"},
+     {PG_EUC_CN, "EUC-CN"},
+     {PG_EUC_JP, "EUC-JP"},
+     {PG_EUC_KR, "EUC-KR"},
+     {PG_EUC_TW, "EUC-TW"},
+     {PG_EUC_JIS_2004, "EUC-JP"}
+ };
+ #endif /* WIN32 */
+
  void
  SetDatabaseEncoding(int encoding)
  {
***************
*** 859,880 **** SetDatabaseEncoding(int encoding)
      Assert(DatabaseEncoding->encoding == encoding);

      /*
!      * On Windows, we allow UTF-8 database encoding to be used with any
!      * locale setting, because UTF-8 requires special handling anyway.
!      * But this means that gettext() might be misled about what output
!      * encoding it should use, so we have to tell it explicitly.
!      *
!      * In future we might want to call bind_textdomain_codeset
!      * unconditionally, but that requires knowing how to spell the codeset
!      * name properly for all encodings on all platforms, which might be
!      * problematic.
!      *
!      * This is presently unnecessary, but harmless, on non-Windows platforms.
       */
! #ifdef ENABLE_NLS
!     if (encoding == PG_UTF8)
!         if (bind_textdomain_codeset(textdomain(NULL), "UTF-8") == NULL)
!             elog(LOG, "bind_textdomain_codeset failed");
  #endif
  }

--- 899,921 ----
      Assert(DatabaseEncoding->encoding == encoding);

      /*
!      * On Windows, we need to explicitly bind gettext to the correct
!      * encoding, because gettext() tends to get confused.
       */
! #if defined(ENABLE_NLS) && defined(WIN32)
!     {
!         int    i;
!
!         for (i = 0; i < sizeof(codeset_map_array) / sizeof(codeset_map_array[0]); i++)
!         {
!             if (codeset_map_array[i].encoding == encoding)
!             {
!                 if (bind_textdomain_codeset(textdomain(NULL), codeset_map_array[i].codeset) == NULL)
!                     elog(LOG, "bind_textdomain_codeset failed");
!                 break;
!             }
!         }
!     }
  #endif
  }


pgsql-hackers by date:

Previous
From: Teodor Sigaev
Date:
Subject: Re: Pluggable Indexes (was Re: rmgr hooks (v2))
Next
From: Simon Riggs
Date:
Subject: Re: rmgr hooks (v2)