diff --git a/backends/dialogs/win32/win32-dialogs.cpp b/backends/dialogs/win32/win32-dialogs.cpp
index 49546182c49..100ed720b16 100644
--- a/backends/dialogs/win32/win32-dialogs.cpp
+++ b/backends/dialogs/win32/win32-dialogs.cpp
@@ -67,6 +67,7 @@
 #include "backends/platform/sdl/win32/win32-window.h"
 
 #include "common/config-manager.h"
+#include "common/encoding.h"
 #include "common/translation.h"
 
 Win32DialogManager::Win32DialogManager(SdlWindow_Win32 *window) : _window(window) {
@@ -130,11 +131,11 @@ Common::DialogManager::DialogResult Win32DialogManager::showFileBrowser(const Co
 			hr = dialog->SetOptions(dwOptions);
 		}
 
-		LPWSTR dialogTitle = Win32::UTF8ToUnicode(title.encode().c_str());
+		LPWSTR dialogTitle = (LPWSTR)Common::Encoding::convert("UTF-16", title);
 		hr = dialog->SetTitle(dialogTitle);
 		free(dialogTitle);
 
-		LPWSTR okTitle = Win32::UTF8ToUnicode(_("Choose").encode().c_str());
+		LPWSTR okTitle = (LPWSTR)Common::Encoding::convert("UTF-16", _("Choose"));
 		hr = dialog->SetOkButtonLabel(okTitle);
 		free(okTitle);
 
diff --git a/backends/platform/sdl/win32/win32_wrapper.cpp b/backends/platform/sdl/win32/win32_wrapper.cpp
index 0ac9d077053..2764453dc18 100644
--- a/backends/platform/sdl/win32/win32_wrapper.cpp
+++ b/backends/platform/sdl/win32/win32_wrapper.cpp
@@ -105,16 +105,4 @@ char *unicodeToAnsi(const wchar_t *s, uint codePage) {
 	return NULL;
 }
 
-wchar_t *UTF8ToUnicode(const char *s) {
-	DWORD size = MultiByteToWideChar(CP_UTF8, 0, s, -1, NULL, 0);
-
-	if (size > 0) {
-		LPWSTR result = (LPWSTR)calloc(size, sizeof(WCHAR));
-		if (MultiByteToWideChar(CP_UTF8, 0, s, -1, result, size) != 0)
-			return result;
-	}
-
-	return NULL;
-}
-
 }
diff --git a/backends/platform/sdl/win32/win32_wrapper.h b/backends/platform/sdl/win32/win32_wrapper.h
index 0b46cae6489..ee3b77bed65 100644
--- a/backends/platform/sdl/win32/win32_wrapper.h
+++ b/backends/platform/sdl/win32/win32_wrapper.h
@@ -61,17 +61,6 @@ wchar_t *ansiToUnicode(const char *s, uint codePage = CP_ACP);
  */
 char *unicodeToAnsi(const wchar_t *s, uint codePage = CP_ACP);
 
-/**
- * Converts a C string encoded in UTF8-multibyte char into a Windows wide-character string.
- * Used to interact with Win32 Unicode APIs with no ANSI fallback.
- *
- * @param s Source string, encoded in UTF8
- * @return Converted string
- *
- * @note Return value must be freed by the caller.
- */
-wchar_t *UTF8ToUnicode(const char *s);
-
 }
 
 #endif
diff --git a/backends/text-to-speech/windows/windows-text-to-speech.cpp b/backends/text-to-speech/windows/windows-text-to-speech.cpp
index c5345440679..9dc79451ee2 100644
--- a/backends/text-to-speech/windows/windows-text-to-speech.cpp
+++ b/backends/text-to-speech/windows/windows-text-to-speech.cpp
@@ -183,15 +183,11 @@ bool WindowsTextToSpeechManager::say(const Common::U32String &str, Action action
 	if (isSpeaking() && action == DROP)
 		return true;
 
-	Common::String strToSpeak = str.encode();
-	Common::String charset = "UTF-8";
-
 	// We have to set the pitch by prepending xml code at the start of the said string;
-	Common::String pitch = Common::String::format("<pitch absmiddle=\"%d\">", _ttsState->_pitch / 10);
-	strToSpeak.replace((uint32)0, 0, pitch);
-	WCHAR *strW = (WCHAR *) Common::Encoding::convert("UTF-16", charset, strToSpeak.c_str(), strToSpeak.size());
+	Common::U32String pitch = Common::U32String::format(Common::U32String("<pitch absmiddle=\"%d\">%S"), _ttsState->_pitch / 10, str.c_str());
+	WCHAR *strW = (WCHAR *) Common::Encoding::convert("UTF-16", pitch);
 	if (strW == nullptr) {
-		warning("Cannot convert from %s encoding for text to speech", charset.c_str());
+		warning("Cannot convert from UTF-32 encoding for text to speech");
 		return true;
 	}