From cc89f4d170cc2a77af79d0c7672963986aefce0e Mon Sep 17 00:00:00 2001 From: yhirose Date: Wed, 13 Nov 2024 22:09:31 -0500 Subject: [PATCH] Fix problems on English locale --- httplib.h | 40 +++++++++++++++++++++++++++------------- test/test.cc | 2 +- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/httplib.h b/httplib.h index 62753e399f..d75dcf0df5 100644 --- a/httplib.h +++ b/httplib.h @@ -2258,13 +2258,33 @@ make_basic_authentication_header(const std::string &username, namespace detail { +#if defined(_WIN32) +std::wstring u8string_to_wstring(const char *s) { + std::wstring ws; + auto len = static_cast(strlen(s)); + auto wlen = ::MultiByteToWideChar(CP_UTF8, 0, s, len, nullptr, 0); + if (wlen > 0) { + ws.resize(wlen); + wlen = ::MultiByteToWideChar(CP_UTF8, 0, s, len, const_cast(reinterpret_cast(ws.data())), wlen); + if (wlen != ws.size()) { + ws.clear(); + } + } + return ws; +} +#endif + struct FileStat { FileStat(const std::string &path); bool is_file() const; bool is_dir() const; private: +#if defined(_WIN32) + struct _stat st_; +#else struct stat st_; +#endif int ret_ = -1; }; @@ -2639,7 +2659,12 @@ inline bool is_valid_path(const std::string &path) { } inline FileStat::FileStat(const std::string &path) { +#if defined(_WIN32) + auto wpath = u8string_to_wstring(path.c_str()); + ret_ = _wstat(wpath.c_str(), &st_); +#else ret_ = stat(path.c_str(), &st_); +#endif } inline bool FileStat::is_file() const { return ret_ >= 0 && S_ISREG(st_.st_mode); @@ -2909,19 +2934,8 @@ inline bool mmap::open(const char *path) { close(); #if defined(_WIN32) - std::wstring wpath; - { - auto cp = ::GetACP(); - - auto len = static_cast(strlen(path)); - auto wlen = ::MultiByteToWideChar(cp, 0, path, len, nullptr, 0); - if (wlen <= 0) { return false; } - - wpath.resize(wlen); - auto pwpath = const_cast(reinterpret_cast(wpath.data())); - wlen = ::MultiByteToWideChar(cp, 0, path, len, pwpath, wlen); - if (wlen != wpath.size()) { return false; } - } + auto wpath = u8string_to_wstring(path); + if (wpath.empty()) { return false; } #if _WIN32_WINNT >= _WIN32_WINNT_WIN8 hFile_ = ::CreateFile2(wpath.c_str(), GENERIC_READ, FILE_SHARE_READ, diff --git a/test/test.cc b/test/test.cc index e278a96953..556bf2497d 100644 --- a/test/test.cc +++ b/test/test.cc @@ -5287,7 +5287,7 @@ TEST(MountTest, MultibytesPathName) { Client cli("localhost", PORT); - auto res = cli.Get("/日本語Dir/日本語File.txt"); + auto res = cli.Get(u8"/日本語Dir/日本語File.txt"); ASSERT_TRUE(res); EXPECT_EQ(StatusCode::OK_200, res->status); EXPECT_EQ(u8"日本語コンテンツ", res->body);