From 430fda564b3a36f346a672668e5181f43132368e Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Wed, 20 Jul 2022 22:38:50 +1200 Subject: [PATCH v3 2/3] Default to UTF-8 in initdb on Windows. --- src/backend/utils/adt/pg_locale.c | 13 ++++++++++++- src/bin/initdb/initdb.c | 4 +++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 607a4b7340..6242dc094d 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1687,8 +1687,19 @@ get_collation_actual_version(char collprovider, const char *collcollate) */ NLSVERSIONINFOEX version = {sizeof(NLSVERSIONINFOEX)}; WCHAR wide_collcollate[LOCALE_NAME_MAX_LENGTH]; + char copy_collcollate[LOCALE_NAME_MAX_LENGTH]; - MultiByteToWideChar(CP_ACP, 0, collcollate, -1, wide_collcollate, + /* Trim off encoding, if there is one */ + strlcpy(copy_collcollate, collcollate, sizeof(copy_collcollate)); + for (char *p = copy_collcollate; *p; ++p) + { + if (*p == '.') + { + *p = 0; + break; + } + } + MultiByteToWideChar(CP_ACP, 0, copy_collcollate, -1, wide_collcollate, LOCALE_NAME_MAX_LENGTH); if (!GetNLSVersionEx(COMPARE_STRING, wide_collcollate, &version)) { diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 3af08b7b99..1170b80d75 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -2040,7 +2040,9 @@ check_locale_name(int category, const char *locale, char **canonname) LOCALE_NAME_MAX_LENGTH, NULL, NULL) == 0) pg_fatal("failed to convert locale name: error code %lu", GetLastError()); - locale_copy = pg_strdup(name); + /* default to UTF-8, no matter what the system default codepage is */ + locale_copy = pg_malloc(strlen(name) + sizeof(".UTF-8") + 1); + sprintf(locale_copy, "%s.UTF-8", name); #else /* use environment to find the default */ locale_copy = pg_strdup(""); -- 2.30.2