pg.ddx.io pgsql-hackers@postgresql.org mailing list archive
help / color / mirror / Atom feed From: Tom Lane <tgl@sss.pgh.pa.us>
To: Juan José SantamarÃa Flecha <juanjo.santamaria@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Subject: Re: Can we get rid of GetLocaleInfoEx() yet?
Date: Sun, 29 Mar 2020 13:00:23 -0400
Message-ID: <28339.1585501223@sss.pgh.pa.us> (raw )
In-Reply-To: <CAC+AXB2xJiYDHDZX01DNchQ0nu4XcQcOX7MHPdAijEaJVhG8DA@mail.gmail.com >
References: <24905.1585445371@sss.pgh.pa.us >
<CAC+AXB2xJiYDHDZX01DNchQ0nu4XcQcOX7MHPdAijEaJVhG8DA@mail.gmail.com >
=?UTF-8?Q?Juan_Jos=C3=A9_Santamar=C3=ADa_Flecha?= <juanjo.santamaria@gmail.com> writes:
> On Sun, Mar 29, 2020 at 3:29 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> The reason for the hack, per the comments, is that VS2015
>> omits a codepage field from the result of _create_locale();
>> and some optimism is expressed therein that Microsoft might
>> undo that oversight in future. Has this been fixed in more
>> recent VS versions? If not, can we find another, more robust
>> way to do it?
> While working on another issue I have seen this issue reproduce in VS2019.
> So no, it has not been fixed.
Oh well, I figured that was too optimistic :-(
> Please find attached a patch that provides a better detection of the "uft8"
> cases.
In general, I think the problem is that we might be dealing with a
Unix-style locale string, in which the encoding name might be quite
a few other things besides "utf8". But actually your patch works
for that too, since what's going to happen next is we'll search the
encoding_match_list[] for a match. I do suggest being a bit more
paranoid about what's a codepage number though, as attached.
(Untested, since I lack a Windows environment, but it's pretty
straightforward code.)
regards, tom lane
Attachments:
fix_win32_langinfo-2.patch (text/x-diff, 1.5K) download
diff --git a/src/port/chklocale.c b/src/port/chklocale.c
index c9c680f..9e3c6db 100644
--- a/src/port/chklocale.c
+++ b/src/port/chklocale.c
@@ -239,25 +239,44 @@ win32_langinfo(const char *ctype)
{
r = malloc(16); /* excess */
if (r != NULL)
- sprintf(r, "CP%u", cp);
+ {
+ /*
+ * If the return value is CP_ACP that means no ANSI code page is
+ * available, so only Unicode can be used for the locale.
+ */
+ if (cp == CP_ACP)
+ strcpy(r, "utf8");
+ else
+ sprintf(r, "CP%u", cp);
+ }
}
else
#endif
{
/*
- * Locale format on Win32 is <Language>_<Country>.<CodePage> . For
- * example, English_United States.1252.
+ * Locale format on Win32 is <Language>_<Country>.<CodePage>. For
+ * example, English_United States.1252. If we see digits after the
+ * last dot, assume it's a codepage number. Otherwise, we might be
+ * dealing with a Unix-style locale string; Windows' setlocale() will
+ * take those even though GetLocaleInfoEx() won't, so we end up here.
+ * In that case, just return what's after the last dot and hope we can
+ * find it in our table.
*/
codepage = strrchr(ctype, '.');
if (codepage != NULL)
{
- int ln;
+ size_t ln;
codepage++;
ln = strlen(codepage);
r = malloc(ln + 3);
if (r != NULL)
- sprintf(r, "CP%s", codepage);
+ {
+ if (strspn(codepage, "0123456789") == ln)
+ sprintf(r, "CP%s", codepage);
+ else
+ strcpy(r, codepage);
+ }
}
}
view thread (6+ messages) latest in thread
Message-ID: <28339.1585501223@sss.pgh.pa.us>
Permalink: ../28339.1585501223@sss.pgh.pa.us/
Also on: postgresql.org/message-id/28339.1585501223@sss.pgh.pa.us
copy link · copy postgr.es · copy git am
reply Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: tgl@sss.pgh.pa.us, juanjo.santamaria@gmail.com, pgsql-hackers@lists.postgresql.org
Subject: Re: Can we get rid of GetLocaleInfoEx() yet?
In-Reply-To: <28339.1585501223@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox