diff --git a/src/debug.cpp b/src/debug.cpp --- a/src/debug.cpp +++ b/src/debug.cpp @@ -131,13 +131,14 @@ static void debug_print(const char *dbg, fflush(f); #endif } else { + char buffer[512]; + seprintf(buffer, lastof(buffer), "%sdbg: [%s] %s\n", GetLogPrefix(), dbg, buf); #if defined(WINCE) - /* We need to do OTTD2FS twice, but as it uses a static buffer, we need to store one temporary */ - TCHAR tbuf[512]; - _sntprintf(tbuf, sizeof(tbuf), _T("%s"), OTTD2FS(dbg)); - NKDbgPrintfW(_T("dbg: [%s] %s\n"), tbuf, OTTD2FS(buf)); + NKDbgPrintfW(OTTD2FS(buffer)); +#elif defined(WIN32) || defined(WIN64) + _fputts(OTTD2FS(buffer, true), stderr); #else - fprintf(stderr, "%sdbg: [%s] %s\n", GetLogPrefix(), dbg, buf); + fputs(buffer, stderr); #endif #ifdef ENABLE_NETWORK NetworkAdminConsole(dbg, buf); diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -621,12 +621,13 @@ const char *FS2OTTD(const TCHAR *name) * The returned value's contents can only be guaranteed until the next call to * this function. So if the value is needed for anything else, use convert_from_fs * @param name pointer to a valid string that will be converted (UTF8) + * @param console_cp convert to the console encoding instead of the normal system encoding. * @return pointer to the converted string; if failed string is of zero-length */ -const TCHAR *OTTD2FS(const char *name) +const TCHAR *OTTD2FS(const char *name, bool console_cp) { static TCHAR system_buf[512]; - return convert_to_fs(name, system_buf, lengthof(system_buf)); + return convert_to_fs(name, system_buf, lengthof(system_buf), console_cp); } @@ -669,9 +670,10 @@ char *convert_from_fs(const TCHAR *name, * @param utf16_buf pointer to a valid wide-char buffer that will receive the * converted string * @param buflen length in wide characters of the receiving buffer + * @param console_cp convert to the console encoding instead of the normal system encoding. * @return pointer to utf16_buf. If conversion fails the string is of zero-length */ -TCHAR *convert_to_fs(const char *name, TCHAR *system_buf, size_t buflen) +TCHAR *convert_to_fs(const char *name, TCHAR *system_buf, size_t buflen, bool console_cp) { #if defined(UNICODE) int len = MultiByteToWideChar(CP_UTF8, 0, name, -1, system_buf, (int)buflen); @@ -686,7 +688,7 @@ TCHAR *convert_to_fs(const char *name, T WCHAR *wide_buf = AllocaM(WCHAR, len); MultiByteToWideChar(CP_UTF8, 0, name, -1, wide_buf, len); - len = WideCharToMultiByte(CP_ACP, 0, wide_buf, len, system_buf, (int)buflen, NULL, NULL); + len = WideCharToMultiByte(console_cp ? CP_OEMCP : CP_ACP, 0, wide_buf, len, system_buf, (int)buflen, NULL, NULL); if (len == 0) system_buf[0] = '\0'; #endif diff --git a/src/os/windows/win32.h b/src/os/windows/win32.h --- a/src/os/windows/win32.h +++ b/src/os/windows/win32.h @@ -19,7 +19,7 @@ typedef void (*Function)(int); bool LoadLibraryList(Function proc[], const char *dll); char *convert_from_fs(const TCHAR *name, char *utf8_buf, size_t buflen); -TCHAR *convert_to_fs(const char *name, TCHAR *utf16_buf, size_t buflen); +TCHAR *convert_to_fs(const char *name, TCHAR *utf16_buf, size_t buflen, bool console_cp = false); /* Function shortcuts for UTF-8 <> UNICODE conversion. When unicode is not * defined these macros return the string passed to them, with UNICODE diff --git a/src/stdafx.h b/src/stdafx.h --- a/src/stdafx.h +++ b/src/stdafx.h @@ -287,7 +287,7 @@ #endif /* WINCE */ const char *FS2OTTD(const TCHAR *name); - const TCHAR *OTTD2FS(const char *name); + const TCHAR *OTTD2FS(const char *name, bool console_cp = false); #define SQ2OTTD(name) FS2OTTD(name) #define OTTD2SQ(name) OTTD2FS(name) #else