43 template <
typename CharT>
44 void encodeCharUtf8(char32_t input, std::basic_string<CharT>& outStrUtf8)
48 outStrUtf8.push_back(
static_cast<CharT
>(input));
53 if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF)))
57 std::size_t bytestoWrite;
60 else if (input < 0x10000)
62 else if (input <= 0x0010FFFF)
67 static const std::uint8_t firstByteMask[5] = { 0, 0, 0xC0, 0xE0, 0xF0 };
70 std::array<CharT, 4> bytes;
71 if (bytestoWrite == 4) { bytes[3] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
72 if (bytestoWrite >= 3) { bytes[2] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
73 if (bytestoWrite >= 2) { bytes[1] =
static_cast<CharT
>((input | 0x80) & 0xBF); input >>= 6; }
74 if (bytestoWrite >= 1) { bytes[0] =
static_cast<CharT
>(input | firstByteMask[bytestoWrite]); }
77 outStrUtf8.append(bytes.begin(), bytes.begin() + bytestoWrite);
88 template <
typename CharIt>
89 CharIt decodeCharUtf8(CharIt inputCharIt, CharIt inputEndIt, std::u32string& outStrUtf32)
91 if (
static_cast<std::uint8_t
>(*inputCharIt) < 128)
93 outStrUtf32.push_back(
static_cast<char32_t
>(
static_cast<std::uint8_t
>(*inputCharIt)));
98 static const std::uint32_t offsetsMap[6] = { 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080 };
99 static const std::uint8_t trailingMap[128] =
101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
104 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5
108 std::uint8_t trailingBytes = trailingMap[
static_cast<std::uint8_t
>(*inputCharIt) - 128];
109 const std::uint32_t offset = offsetsMap[trailingBytes];
110 if (inputCharIt + trailingBytes < inputEndIt)
112 char32_t outputChar = 0;
113 while (trailingBytes > 0)
115 outputChar +=
static_cast<char32_t
>(
static_cast<std::uint8_t
>(*inputCharIt++));
120 outputChar +=
static_cast<char32_t
>(
static_cast<std::uint8_t
>(*inputCharIt++));
121 outputChar -= offset;
122 outStrUtf32.push_back(outputChar);
125 inputCharIt = inputEndIt;
131#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201811L)
137 inline std::u8string convertUtf32toUtf8(
const std::u32string& strUtf32)
139 std::u8string outStrUtf8;
140 outStrUtf8.reserve(strUtf32.length() + 1);
141 for (
const char32_t& codepoint : strUtf32)
142 encodeCharUtf8(codepoint, outStrUtf8);
154 template <
typename CharIt>
155 std::u32string convertUtf8toUtf32(CharIt inputBegin, CharIt inputEnd)
157 std::u32string outStrUtf32;
158 outStrUtf32.reserve((inputEnd - inputBegin) + 1);
160 auto it = inputBegin;
161 while (it < inputEnd)
162 it = decodeCharUtf8(it, inputEnd, outStrUtf32);
174 template <
typename U16CharIt>
175 std::u32string convertUtf16toUtf32(U16CharIt inputBegin, U16CharIt inputEnd)
177 std::u32string outStrUtf32;
178 outStrUtf32.reserve((inputEnd - inputBegin) + 1);
180 auto it = inputBegin;
181 while (it < inputEnd)
183 const char16_t first = *it++;
186 if ((first < 0xD800) || (first > 0xDBFF))
188 outStrUtf32.push_back(
static_cast<char32_t
>(first));
196 const char16_t second = *it++;
197 if ((second >= 0xDC00) && (second <= 0xDFFF))
198 outStrUtf32.push_back(((
static_cast<char32_t
>(first) - 0xD800) << 10) + (
static_cast<char32_t
>(second) - 0xDC00) + 0x0010000);
211 template <
typename WCharIt>
212 std::u32string convertWidetoUtf32(WCharIt inputBegin, WCharIt inputEnd)
214 std::u32string outStrUtf32;
215 outStrUtf32.reserve((inputEnd - inputBegin) + 1);
218 for (
auto it = inputBegin; it != inputEnd; ++it)
219 outStrUtf32.push_back(
static_cast<char32_t
>(*it));
231 inline std::string convertUtf32toLatin1(
const std::u32string& strUtf32)
234 outStr.reserve(strUtf32.length() + 1);
235 for (
const char32_t codepoint : strUtf32)
238 outStr.push_back(
static_cast<char>(codepoint));
250 inline std::string convertUtf32toStdStringUtf8(
const std::u32string& strUtf32)
252 std::string outStrUtf8;
253 outStrUtf8.reserve(strUtf32.length() + 1);
254 for (
const char32_t codepoint : strUtf32)
255 encodeCharUtf8(codepoint, outStrUtf8);
266 inline std::wstring convertUtf32toWide(
const std::u32string& strUtf32)
269 outStr.reserve(strUtf32.length() + 1);
272#if defined(__cpp_if_constexpr) && (__cpp_if_constexpr >= 201606L)
273 if constexpr (
sizeof(wchar_t) == 4)
275 #if defined TGUI_SYSTEM_WINDOWS && defined _MSC_VER
276 #pragma warning(push)
277 #pragma warning(disable:4127)
279 if (
sizeof(
wchar_t) == 4)
280 #
if defined TGUI_SYSTEM_WINDOWS && defined _MSC_VER
286 for (
const char32_t codepoint : strUtf32)
287 outStr.push_back(
static_cast<wchar_t>(codepoint));
292 for (
const char32_t codepoint : strUtf32)
294 if ((codepoint < 0xD800) || ((codepoint > 0xDFFF) && (codepoint <= 0xFFFF)))
295 outStr.push_back(
static_cast<wchar_t>(codepoint));
308 inline std::u16string convertUtf32toUtf16(
const std::u32string& strUtf32)
310 std::u16string outStrUtf16;
311 outStrUtf16.reserve(strUtf32.length() + 1);
313 for (
const char32_t codepoint : strUtf32)
316 if (codepoint <= 0xFFFF)
318 if ((codepoint < 0xD800) || (codepoint > 0xDFFF))
319 outStrUtf16.push_back(
static_cast<char16_t
>(codepoint));
323 else if (codepoint > 0x0010FFFF)
327 outStrUtf16.push_back(
static_cast<char16_t
>(((codepoint - 0x0010000) >> 10) + 0xD800));
328 outStrUtf16.push_back(
static_cast<char16_t
>(((codepoint - 0x0010000) & 0x3FFUL) + 0xDC00));
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:37