diff --git a/src/fios.cpp b/src/fios.cpp
index 615570742e..c8d7fdf8d1 100644
--- a/src/fios.cpp
+++ b/src/fios.cpp
@@ -224,7 +224,7 @@ static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_
 	}
 
 	/* Show subdirectories */
-	if (mode != SLD_NEW_GAME && (dir = opendir(_fios_path)) != NULL) {
+	if (mode != SLD_NEW_GAME && (dir = ttd_opendir(_fios_path)) != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name));
 
@@ -254,7 +254,7 @@ static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_
 	sort_start = _fios_count;
 
 	/* Show files */
-	dir = opendir(_fios_path);
+	dir = ttd_opendir(_fios_path);
 	if (dir != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			char fios_title[64];
diff --git a/src/fios.h b/src/fios.h
index 85d0b6041d..0663b781b7 100644
--- a/src/fios.h
+++ b/src/fios.h
@@ -77,10 +77,21 @@ struct DIR {
 	bool at_first_entry;
 };
 
-DIR *opendir(const char *path);
+DIR *opendir(const wchar_t *path);
 struct dirent *readdir(DIR *d);
 int closedir(DIR *d);
-
 #endif /* defined(WIN32) */
 
+/**
+ * A wrapper around opendir() which will convert the string from
+ * OPENTTD encoding to that of the filesystem. For all purposes this
+ * function behaves the same as the original opendir function
+ * @param path string to open directory of
+ * @return DIR pointer
+ */
+static inline DIR *ttd_opendir(const char *path)
+{
+	return opendir(OTTD2FS(path));
+}
+
 #endif /* FIOS_H */
diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp
index 583b4773bd..6b13ecc2e4 100644
--- a/src/newgrf_config.cpp
+++ b/src/newgrf_config.cpp
@@ -274,7 +274,7 @@ static uint ScanPath(const char *path)
 	struct dirent *dirent;
 	DIR *dir;
 
-	if ((dir = opendir(path)) == NULL) return 0;
+	if ((dir = ttd_opendir(path)) == NULL) return 0;
 
 	while ((dirent = readdir(dir)) != NULL) {
 		const char *d_name = FS2OTTD(dirent->d_name);
diff --git a/src/strings.cpp b/src/strings.cpp
index d794e9c978..d1ab5df0c4 100644
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -1164,7 +1164,7 @@ static int GetLanguageList(char **languages, int max)
 	struct dirent *dirent;
 	int num = 0;
 
-	dir = opendir(_paths.lang_dir);
+	dir = ttd_opendir(_paths.lang_dir);
 	if (dir != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			const char *d_name = FS2OTTD(dirent->d_name);
diff --git a/src/win32.cpp b/src/win32.cpp
index a79fda13aa..017d62a2cb 100644
--- a/src/win32.cpp
+++ b/src/win32.cpp
@@ -653,19 +653,19 @@ static inline void dir_free(DIR *d)
 	}
 }
 
-DIR *opendir(const char *path)
+DIR *opendir(const wchar_t *path)
 {
 	DIR *d;
 	UINT sem = SetErrorMode(SEM_FAILCRITICALERRORS); // disable 'no-disk' message box
-	DWORD fa = GetFileAttributesW(OTTD2FS(path));
+	DWORD fa = GetFileAttributesW(path);
 
 	if ((fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) {
 		d = dir_calloc();
 		if (d != NULL) {
-			char search_path[MAX_PATH];
+			wchar_t search_path[MAX_PATH];
 			/* build search path for FindFirstFile */
-			snprintf(search_path, lengthof(search_path), "%s" PATHSEP "*", path);
-			d->hFind = FindFirstFileW(OTTD2FS(search_path), &d->fd);
+			_snwprintf_s(search_path, lengthof(search_path), L"%s\\*", path);
+			d->hFind = FindFirstFileW(search_path, &d->fd);
 
 			if (d->hFind != INVALID_HANDLE_VALUE ||
 					GetLastError() == ERROR_NO_MORE_FILES) { // the directory is empty