From 72aa534b813f957053849be7668f6da35faad9f2 Mon Sep 17 00:00:00 2001 From: shiagarw Date: Sun, 20 Dec 2020 23:49:18 +0530 Subject: [PATCH] Adding support of UTF8 file name processing in mio on windows Contributing back changes from app. --- include/mio/detail/mmap.ipp | 12 +++++++++++- single_include/mio/mio.hpp | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/mio/detail/mmap.ipp b/include/mio/detail/mmap.ipp index aaf6494..2dbfe1f 100644 --- a/include/mio/detail/mmap.ipp +++ b/include/mio/detail/mmap.ipp @@ -68,13 +68,23 @@ template< 0); } +std::wstring s_2_ws(const std::string& s) +{ + if (s.empty()) + return{}; + const auto s_length = static_cast(s.length()); + auto buf = std::vector(s_length); + const auto wide_char_count = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), sLength, buf.data(), s_length); + return std::wstring(buf.data(), wide_char_count); +} + template typename std::enable_if< std::is_same::type, wchar_t>::value, file_handle_type >::type open_file_helper(const String& path, const access_mode mode) { - return ::CreateFileW(c_str(path), + return ::CreateFileW(s_2_ws(path).c_str(), mode == access_mode::read ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, diff --git a/single_include/mio/mio.hpp b/single_include/mio/mio.hpp index 95c696c..f1b53c7 100644 --- a/single_include/mio/mio.hpp +++ b/single_include/mio/mio.hpp @@ -810,13 +810,23 @@ template< 0); } +std::wstring s_2_ws(const std::string& s) +{ + if (s.empty()) + return{}; + const auto s_length = static_cast(s.length()); + auto buf = std::vector(s_length); + const auto wide_char_count = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), sLength, buf.data(), s_length); + return std::wstring(buf.data(), wide_char_count); +} + template typename std::enable_if< std::is_same::type, wchar_t>::value, file_handle_type >::type open_file_helper(const String& path, const access_mode mode) { - return ::CreateFileW(c_str(path), + return ::CreateFileW(s_2_ws(path).c_str(), mode == access_mode::read ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0,