Files
MicroH7Board.Firmware/Dependencies/LFramework/Src/LFramework/Text/Encoding.h
T
2025-05-13 02:03:18 +03:00

87 lines
3.1 KiB
C++

#pragma once
#include <codecvt>
#include <string>
namespace LFramework::Text {
class Encoding {
public:
#if defined(_MSC_VER) && _MSC_VER >= 1900
// https://social.msdn.microsoft.com/Forums/en-US/8f40dcd8-c67f-4eba-9134-a19b9178e481/vs-2015-rc-linker-stdcodecvt-error?forum=vcgeneral
#define _MSVC_CONVERT_WORKAROUND
#endif
#if defined(_MSVC_CONVERT_WORKAROUND)
static inline std::wstring_convert<std::codecvt_utf8<int32_t>, int32_t> s_u32Converter;
static inline std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> s_u16Converter;
#else
static inline std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> s_u32Converter;
static inline std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> s_u16Converter;
#endif
static std::wstring u8StringToWString(const std::string& src) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
return converter.from_bytes(src);
}
static std::string wStringToU8String(const std::wstring& src) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> convert;
return convert.to_bytes(src);
}
static std::u32string u16StringToU32String(const std::u16string& u16String)
{
std::string temp{ u16StringToU8String(u16String) };
return u8StringToU32String(temp);
}
static std::string u16StringToU8String(const std::u16string& u16String)
{
#if defined(_MSVC_CONVERT_WORKAROUND)
using workaround_str = std::basic_string<int16_t, std::char_traits<int16_t>, std::allocator<int16_t> >;
workaround_str workaround(reinterpret_cast<const int16_t*>(u16String.c_str()));
return s_u16Converter.to_bytes(workaround);
#else
return s_u16Converter.to_bytes(u16String);
#endif
}
static std::string u32StringToU8String(const std::u32string& u32String)
{
#if defined(_MSVC_CONVERT_WORKAROUND)
using workaround_str = std::basic_string<int32_t, std::char_traits<int32_t>, std::allocator<int32_t> >;
workaround_str workaround(reinterpret_cast<const int32_t*>(u32String.c_str()));
return s_u32Converter.to_bytes(workaround);
#else
return s_u32Converter.to_bytes(u32String);
#endif
}
static std::u16string u8StringToU16String(const std::string& u8String)
{
#if defined(_MSVC_CONVERT_WORKAROUND)
auto&& workaround = s_u16Converter.from_bytes(u8String);
return std::u16string(reinterpret_cast<const char16_t*>(workaround.c_str()));
#else
return s_u16Converter.from_bytes(u8String);
#endif
}
static std::u32string u8StringToU32String(const std::string& u8String)
{
#if defined(_MSVC_CONVERT_WORKAROUND)
auto&& workaround = s_u32Converter.from_bytes(u8String);
return std::u32string(reinterpret_cast<const char32_t*>(workaround.c_str()));
#else
return s_u32Converter.from_bytes(u8String);
#endif
}
};
}
#ifdef _MSVC_CONVERT_WORKAROUND
#undef _MSVC_CONVERT_WORKAROUND
#endif