From 65ff72cdf8d3fc8664893b55ca47fca284f34d87 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 25 Feb 2015 16:01:46 +0100 Subject: fs/Traits: enable _UNICODE on Windows Use wchar_t for everything on Windows. Solves a lot of filesystem charset problems. --- src/fs/Charset.cxx | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src/fs/Charset.cxx') diff --git a/src/fs/Charset.cxx b/src/fs/Charset.cxx index bc6357297..b25615d42 100644 --- a/src/fs/Charset.cxx +++ b/src/fs/Charset.cxx @@ -25,6 +25,10 @@ #include "lib/icu/Converter.hxx" #include "util/Error.hxx" +#ifdef WIN32 +#include +#endif + #include #include @@ -95,6 +99,24 @@ PathToUTF8(PathTraitsFS::const_pointer path_fs) assert(path_fs != nullptr); #endif +#ifdef WIN32 + int length = WideCharToMultiByte(CP_UTF8, 0, path_fs, -1, nullptr, 0, + nullptr, nullptr); + if (length <= 0) + return PathTraitsUTF8::string(); + + char *buffer = new char[length]; + length = WideCharToMultiByte(CP_UTF8, 0, path_fs, -1, buffer, length, + nullptr, nullptr); + if (length <= 0) { + delete[] buffer; + return PathTraitsUTF8::string(); + } + + PathTraitsUTF8::string result(buffer); + delete[] buffer; + return FixSeparators(std::move(result)); +#else #ifdef HAVE_FS_CHARSET if (fs_converter == nullptr) #endif @@ -103,9 +125,10 @@ PathToUTF8(PathTraitsFS::const_pointer path_fs) return FixSeparators(fs_converter->ToUTF8(path_fs)); #endif +#endif } -#ifdef HAVE_FS_CHARSET +#if defined(HAVE_FS_CHARSET) || defined(WIN32) PathTraitsFS::string PathFromUTF8(PathTraitsUTF8::const_pointer path_utf8) @@ -115,10 +138,29 @@ PathFromUTF8(PathTraitsUTF8::const_pointer path_utf8) assert(path_utf8 != nullptr); #endif +#ifdef WIN32 + int length = MultiByteToWideChar(CP_UTF8, 0, path_utf8, -1, + nullptr, 0); + if (length <= 0) + return PathTraitsFS::string(); + + wchar_t *buffer = new wchar_t[length]; + length = MultiByteToWideChar(CP_UTF8, 0, path_utf8, -1, + buffer, length); + if (length <= 0) { + delete[] buffer; + return PathTraitsFS::string(); + } + + PathTraitsFS::string result(buffer); + delete[] buffer; + return std::move(result); +#else if (fs_converter == nullptr) return path_utf8; return fs_converter->FromUTF8(path_utf8); +#endif } #endif -- cgit v1.2.3