diff --git a/Win32/Win32App.cpp b/Win32/Win32App.cpp index 742ad30d..0c701c59 100644 --- a/Win32/Win32App.cpp +++ b/Win32/Win32App.cpp @@ -313,7 +313,7 @@ namespace win32 } case ID_DATADIR: { - std::string datadir(i2p::fs::GetUTF8DataDir()); + std::string datadir(i2p::fs::GetDataDir()); ShellExecute(NULL, "explore", datadir.c_str(), NULL, NULL, SW_SHOWNORMAL); return 0; } diff --git a/libi2pd/FS.cpp b/libi2pd/FS.cpp index 61bdefe0..a370bc2f 100644 --- a/libi2pd/FS.cpp +++ b/libi2pd/FS.cpp @@ -61,15 +61,17 @@ namespace fs { const std::string GetUTF8DataDir () { #ifdef _WIN32 -#if ((BOOST_VERSION >= 108500) || STD_FILESYSTEM) - fs_lib::path path (dataDir); -#else - fs_lib::wpath path (dataDir); -#endif - auto loc = fs_lib::path::imbue(std::locale( std::locale(), new std::codecvt_utf8_utf16() ) ); // convert path to UTF-8 - auto dataDirUTF8 = path.string(); - fs_lib::path::imbue(loc); // Return locale settings back - return dataDirUTF8; + int size = MultiByteToWideChar(CP_ACP, 0, + dataDir.c_str(), dataDir.size(), nullptr, 0); + std::wstring utf16Str(size, L'\0'); + MultiByteToWideChar(CP_ACP, 0, + dataDir.c_str(), dataDir.size(), &utf16Str[0], size); + int utf8Size = WideCharToMultiByte(CP_UTF8, 0, + utf16Str.c_str(), utf16Str.size(), nullptr, 0, nullptr, nullptr); + std::string utf8Str(utf8Size, '\0'); + WideCharToMultiByte(CP_UTF8, 0, + utf16Str.c_str(), utf16Str.size(), &utf8Str[0], utf8Size, nullptr, nullptr); + return utf8Str; #else return dataDir; // linux, osx, android uses UTF-8 by default #endif