From 430fda564b3a36f346a672668e5181f43132368e Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
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

