From 6f664f68117320d81df1ab446b1aa6b6bbffe389 Mon Sep 17 00:00:00 2001 From: boludoz Date: Sat, 7 Oct 2023 14:38:59 -0300 Subject: [PATCH] Replaced native with "Boost locale" for string conversions multiplataform like (Tested) --- src/common/fs/fs_util.cpp | 30 ++++++++++++++++-------------- vcpkg.json | 1 + 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/common/fs/fs_util.cpp b/src/common/fs/fs_util.cpp index e4833dd3d7..72c5d291d4 100644 --- a/src/common/fs/fs_util.cpp +++ b/src/common/fs/fs_util.cpp @@ -4,9 +4,7 @@ #include #include #include -#ifdef _WIN32 -#include // For MultiByteToWideChar (cannon UTF-8 with Windows) -#endif +#include #include "common/fs/fs_util.h" #include "common/polyfill_ranges.h" @@ -14,7 +12,14 @@ namespace Common::FS { std::u8string ToU8String(std::wstring_view w_string) { - return std::u8string{reinterpret_cast(w_string.data())}; + try { + auto utf8_string = boost::locale::conv::utf_to_utf(w_string.data(), w_string.data() + w_string.size()); + return std::u8string(utf8_string.begin(), utf8_string.end()); + } catch (const boost::locale::conv::conversion_error) { + return std::u8string{reinterpret_cast(w_string.data())}; + } catch (const boost::locale::conv::invalid_charset_error) { + return std::u8string{reinterpret_cast(w_string.data())}; + } } std::u8string ToU8String(std::string_view string) { @@ -30,16 +35,13 @@ std::u8string_view BufferToU8StringView(std::span buffer) { } std::wstring ToWString(std::u8string_view utf8_string) { -#ifdef _WIN32 - int size_needed = MultiByteToWideChar( - CP_UTF8, 0, reinterpret_cast(utf8_string.data()), -1, NULL, 0); - std::wstring wstr(size_needed, 0); - MultiByteToWideChar(CP_UTF8, 0, reinterpret_cast(utf8_string.data()), -1, &wstr[0], - size_needed); - return wstr; -#else - return std::wstring{utf8_string.begin(), utf8_string.end()}; -#endif + try { + return boost::locale::conv::utf_to_utf(utf8_string.data(), utf8_string.data() + utf8_string.size()); + } catch (const boost::locale::conv::conversion_error) { + return std::wstring(utf8_string.begin(), utf8_string.end()); + } catch (const boost::locale::conv::invalid_charset_error) { + return std::wstring(utf8_string.begin(), utf8_string.end()); + } } std::string ToUTF8String(std::u8string_view u8_string) { diff --git a/vcpkg.json b/vcpkg.json index 203fc9708b..2670489908 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -22,6 +22,7 @@ "boost-test", "boost-timer", "boost-variant", + "boost-locale", "fmt", "lz4", "nlohmann-json",