From 30177b9d2a3f87955005f39418dbcf8b1c76dfca Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 7 Apr 2026 00:03:56 +0300 Subject: [PATCH] fix stringutil locale-related functions --- src/util/stringutil.cpp | 17 +++++++---------- test/util/stringutil.cpp | 6 ++++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/util/stringutil.cpp b/src/util/stringutil.cpp index e1a99f9e0..0329305c3 100644 --- a/src/util/stringutil.cpp +++ b/src/util/stringutil.cpp @@ -7,6 +7,8 @@ #include #include +static std::locale locale("en_US.UTF-8"); + std::string util::escape(std::string_view s, bool escapeUnicode) { std::stringstream ss; ss << '"'; @@ -507,39 +509,34 @@ double util::parse_double(const std::string& str, size_t offset, size_t len) { std::wstring util::lower_case(const std::wstring& str) { std::wstring result = str; - static const std::locale loc(""); for (uint i = 0; i < result.length(); i++) { - result[i] = static_cast(std::tolower(str[i], loc)); + result[i] = static_cast(std::tolower(str[i], locale)); } return result; } std::wstring util::upper_case(const std::wstring& str) { std::wstring result = str; - static const std::locale loc(""); for (uint i = 0; i < result.length(); i++) { - result[i] = static_cast(std::toupper(str[i], loc)); + result[i] = static_cast(std::toupper(str[i], locale)); } return result; } std::wstring util::capitalized(const std::wstring& str) { if (str.empty()) return str; - static const std::locale loc(""); - return std::wstring({static_cast(std::toupper(str[0], loc))}) + + return std::wstring({static_cast(std::toupper(str[0], locale))}) + str.substr(1); } std::string util::capitalized(const std::string& str) { if (str.empty()) return str; - static const std::locale loc(""); - return std::string({static_cast(std::toupper(str[0], loc))}) + + return std::string({static_cast(std::toupper(str[0], locale))}) + str.substr(1); } std::wstring util::pascal_case(const std::wstring& str) { if (str.empty()) return str; - static const std::locale loc(""); std::wstring result = str; bool upper = true; for (uint i = 0; i < result.length(); i++) { @@ -547,7 +544,7 @@ std::wstring util::pascal_case(const std::wstring& str) { if (c <= ' ') { upper = true; } else if (upper) { - result[i] = static_cast(std::toupper(str[i], loc)); + result[i] = static_cast(std::toupper(str[i], locale)); upper = false; } } diff --git a/test/util/stringutil.cpp b/test/util/stringutil.cpp index 22df2b356..a057d4e69 100644 --- a/test/util/stringutil.cpp +++ b/test/util/stringutil.cpp @@ -101,3 +101,9 @@ TEST(stringutil, escape_cases) { } EXPECT_EQ(utf8str, restored); } + +TEST(stringutil, cases) { + EXPECT_EQ(util::upper_case(L"тест"), std::wstring(L"ТЕСТ")); + EXPECT_EQ(util::lower_case(L"ТЕСТ"), std::wstring(L"тест")); + EXPECT_EQ(util::pascal_case(L"тестовая строка"), std::wstring(L"Тестовая Строка")); +}