diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index cd1ee00c10a784d26c581ff71ac03c35a5835a91..83e3a11c38f4841f631dd1192c2011c791d6cf39 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -4,7 +4,7 @@
  * (currently mule internal code (mic) is used)
  * Tatsuo Ishii
  *
- * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.70 2008/04/12 23:21:04 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.71 2008/05/27 12:24:42 mha Exp $
  */
 #include "postgres.h"
 
@@ -697,6 +697,25 @@ SetDatabaseEncoding(int encoding)
 
 	DatabaseEncoding = &pg_enc2name_tbl[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("postgres", "UTF-8") == NULL)
+			elog(LOG, "bind_textdomain_codeset failed");
+#endif
 }
 
 void