diff --git a/src/logic/scripting/lua/libs/libutf8.cpp b/src/logic/scripting/lua/libs/libutf8.cpp index 163f07e4e..918bda095 100644 --- a/src/logic/scripting/lua/libs/libutf8.cpp +++ b/src/logic/scripting/lua/libs/libutf8.cpp @@ -66,19 +66,13 @@ static int l_sub(lua::State* L) { } static int l_upper(lua::State* L) { - auto string = util::str2u32str_utf8(lua::require_string(L, 1)); - for (auto& c : string) { - c = std::towupper(c); - } - return lua::pushstring(L, util::u32str2str_utf8(string)); + auto string = util::str2wstr_utf8(lua::require_string(L, 1)); + return lua::pushwstring(L, util::upper_case(string)); } static int l_lower(lua::State* L) { - auto string = util::str2u32str_utf8(lua::require_string(L, 1)); - for (auto& c : string) { - c = std::towlower(c); - } - return lua::pushstring(L, util::u32str2str_utf8(string)); + auto string = util::str2wstr_utf8(lua::require_string(L, 1)); + return lua::pushwstring(L, util::lower_case(string)); } static int l_encode(lua::State* L) { diff --git a/src/util/stringutil.cpp b/src/util/stringutil.cpp index 0329305c3..f97eed83e 100644 --- a/src/util/stringutil.cpp +++ b/src/util/stringutil.cpp @@ -507,22 +507,32 @@ double util::parse_double(const std::string& str, size_t offset, size_t len) { return parse_double(str.substr(offset, len)); } -std::wstring util::lower_case(const std::wstring& str) { - std::wstring result = str; +template +static std::basic_string lower_case(const std::basic_string& str) { + std::basic_string result = str; for (uint i = 0; i < result.length(); i++) { - result[i] = static_cast(std::tolower(str[i], locale)); + result[i] = std::tolower(str[i], locale); } return result; } -std::wstring util::upper_case(const std::wstring& str) { - std::wstring result = str; +template +static std::basic_string upper_case(const std::basic_string& str) { + std::basic_string result = str; for (uint i = 0; i < result.length(); i++) { - result[i] = static_cast(std::toupper(str[i], locale)); + result[i] = std::toupper(str[i], locale); } return result; } +std::wstring util::lower_case(const std::wstring& str) { + return ::lower_case(str); +} + +std::wstring util::upper_case(const std::wstring& str) { + return ::upper_case(str); +} + std::wstring util::capitalized(const std::wstring& str) { if (str.empty()) return str; return std::wstring({static_cast(std::toupper(str[0], locale))}) +