Commit 0fb54de9a ("Support building with Visual Studio 2015") introduced a hack in chklocale.c's win32_langinfo() to make it use GetLocaleInfoEx() in place of _create_locale().
There's a problem with this, which is that if I'm reading the docs correctly, GetLocaleInfoEx() accepts a smaller set of possible locale strings (only "locale names") than do either _create_locale() or setlocale(). The _create_locale() docs say The locale argument can take a locale name, a language string, a language string and country/region code, a code page, or a language string, country/region code, and code page. and they imply (but don't quite manage to say in so many words) that these are the same strings accepted by setlocale(). The reason this is a problem is that when given a locale string, in either initdb or CREATE DATABASE, we first validate it by seeing if setlocale() likes it. We produce a reasonable error message if not. Otherwise we then go on to try to identify the implied encoding via chklocale.c. But if GetLocaleInfoEx() fails, we fall back to trying to parse out the codepage for ourselves, which can lead to a silly/unhelpful error message, as recently complained of at [1]. 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? regards, tom lane [1] https://www.postgresql.org/message-id/flat/F4D04849032C4464B8FF17CB0F896F9E%40dell2