24 template<
typename N = UInt_64>
31 for (N i = 0; i < result.
Size(); ++i)
33 if (i != result.
Size() - 1)
35 if ((from[i] & 0xDC00) == 0xDC00 && (from[i + 1] & 0xD800) == 0xD800)
37 result[index++] = (((from[i] - 0xD800) * 0x400) | (from[i] - 0xDC00)) + 0x10000;
43 result[index++] = (
Char_32)from[i];
55 template<
typename N = UInt_64>
62 for (N i = 0; i < from.
Size(); ++i)
64 if (i != from.
Size() - 1)
66 if ((from[i] & 0xDC00) == 0xDC00 && (from[i + 1] & 0xD800) == 0xD800)
68 result[index++] = (((from[i] - 0xD800) * 0x400) | (from[i] - 0xDC00)) + 0x10000;
74 result[index++] = (
Char_32)from[i];
87 template<
typename N = UInt_64>
96 for (N i = 0; i < rSize; ++i)
98 if (from[i] <= 0b11110111 && i + 3 < rSize && from[i + 1] <= 0b10111111 && from[i + 2] <= 0b10111111 && from[i + 3] <= 0b10111111)
99 r[c++] = (
Char_32)(from[i++] & 0b00000111) << 18 | (
Char_32)(from[i++] & 0b00111111) << 12 | (
Char_32)(from[i++] & 0b00111111) << 6 | (
Char_32)(from[i] & 0b00111111);
100 else if (from[i] <= 0b11101111 && i + 2 < rSize && from[i + 1] <= 0b10111111 && from[i + 2] <= 0b10111111)
101 r[c++] = (
Char_32)(from[i++] & 0b00001111) << 12 | (
Char_32)(from[i++] & 0b00111111) << 6 | ((
Char_32)from[i] & 0b00111111);
102 else if (from[i] <= 0b11011111 && i + 1 < rSize && from[i + 1] <= 0b10111111)
103 r[c++] = (
Char_32)(from[i++] & 0b00011111) << 6 | (
Char_32)(from[i] & 0b00111111);
117 template<
typename N = UInt_64>
124 for (N i = 0; i < from.
Size(); ++i)
126 if (from[i] <= 0b11110111 && i + 3 < from.
Size() && from[i + 1] <= 0b10111111 && from[i + 2] <= 0b10111111 && from[i + 3] <= 0b10111111)
127 r[c++] = (
Char_32)(from[i++] & 0b00000111) << 18 | (
Char_32)(from[i++] & 0b00111111) << 12 | (
Char_32)(from[i++] & 0b00111111) << 6 | (
Char_32)(from[i] & 0b00111111);
128 else if (from[i] <= 0b11101111 && i + 2 < from.
Size() && from[i + 1] <= 0b10111111 && from[i + 2] <= 0b10111111)
129 r[c++] = (
Char_32)(from[i++] & 0b00001111) << 12 | (
Char_32)(from[i++] & 0b00111111) << 6 | ((
Char_32)from[i] & 0b00111111);
130 else if (from[i] <= 0b11011111 && i + 1 < from.
Size() && from[i + 1] <= 0b10111111)
131 r[c++] = (
Char_32)(from[i++] & 0b00011111) << 6 | (
Char_32)(from[i] & 0b00111111);
146 template<
typename N = UInt_64>
155 for (N i = 0; i < rSize; ++i)
157 if (from[i] <= 0xFFFF)
159 result[index++] = (
Char_16)from[i];
165 result[index++] |= (t >> 10) + 0xD800;
166 result[index++] |= t + 0xDC00;
179 template<
typename N = UInt_64>
186 for (N i = 0; i < from.
Size(); ++i)
188 if (from[i] <= 0xFFFF)
190 result[index++] = (
Char_16)from[i];
196 result[index++] |= (t >> 10) + 0xD800;
197 result[index++] |= t + 0xDC00;
211 template<
typename N = UInt_64>
216 const Byte*
const data = (
const Byte*
const)from;
222 for (N i = 0; i < rSize; ++i)
224 if (data[i] >= 0b11110000 && i + 3 < rSize && data[i + 1] <= 0b10111111 && data[i + 2] <= 0b10111111 && data[i + 3] <= 0b10111111)
225 r[c++] = (0b00000011111111110000001111111111 &
226 ((
Char_16)(data[i++] & 0b00000111) << 23) |
227 ((
Char_16)(data[i++] & 0b00111111) << 18) |
228 ((
Char_16)(data[i++] & 0b00111111) << 12) |
229 ((
Char_16)(data[i++] & 0b00111111) << 6) |
230 (
Char_16)(data[i] & 0b00111111)) |
231 0b11011000000000001101110000000000;
232 else if (data[i] >= 0b11100000 && i + 2 < rSize && data[i + 1] <= 0b10111111 && data[i + 2] <= 0b10111111)
233 r[c++] = ((
Char_16)(data[i++] & 0b00001111) << 12) | ((
Char_16)(data[i++] & 0b00111111) << 6) | (
Char_16)(data[i] & 0b00111111);
234 else if (data[i] >= 0b11000000 && i + 1 < rSize && data[i + 1] <= 0b10111111)
235 r[c++] = (
Char_16)(data[i++] & 0b00011111) << 6 | (
Char_16 )(data[i] & 0b00111111);
249 template<
typename N = UInt_64>
258 for (N i = 0; i < from.
Size(); ++i)
260 if (data[i] >= 0b11110000 && i + 3 < from.
Size() && data[i + 1] <= 0b10111111 && data[i + 2] <= 0b10111111 && data[i + 3] <= 0b10111111)
261 r[c++] = (0b00000011111111110000001111111111 &
262 ((
Char_16)(data[i++] & 0b00000111) << 23) |
263 ((
Char_16)(data[i++] & 0b00111111) << 18) |
264 ((
Char_16)(data[i++] & 0b00111111) << 12) |
265 ((
Char_16)(data[i++] & 0b00111111) << 6) |
266 (
Char_16)(data[i] & 0b00111111)) |
267 0b11011000000000001101110000000000;
268 else if (data[i] >= 0b11100000 && i + 2 < from.
Size() && data[i + 1] <= 0b10111111 && data[i + 2] <= 0b10111111)
269 r[c++] = ((
Char_16)(data[i++] & 0b00001111) << 12) | ((
Char_16)(data[i++] & 0b00111111) << 6) | (
Char_16)(data[i] & 0b00111111);
270 else if (data[i] >= 0b11000000 && i + 1 < from.
Size() && data[i + 1] <= 0b10111111)
271 r[c++] = (
Char_16)(data[i++] & 0b00011111) << 6 | (
Char_16 )(data[i] & 0b00111111);
286 template<
typename N = UInt_64>
295 for (N i = 0; i < rSize; ++i)
297 if (from[i] & 0b1101100000000000 && i + 1 < rSize && from[i] & 0b1101110000000000)
299 r[c++] = ((
Byte*)&from[i])[1] & 00000111 | 0b11110000;
300 r[c++] = ((
Byte*)&from[i])[0] >> 2 & 0b00111111 | 0b10000000;
301 r[c++] = ((
Byte*)&from[i])[0] << 4 | (((
Byte*)&from[i + 1])[1] & 0b00000011) << 2 | ((
Byte*)&from[i + 1])[0] >> 6 & 0b00111111 | 0b10000000;
302 r[c++] = ((
Byte*)&from[++i])[0] & 0b00111111 | 0b10000000;
304 else if (from[i] <= 0b11111111)
306 r[c++] = (
Byte)from[i];
308 else if (from[i] > 0b11111111 && from[i] <= 0b0000011111111111)
310 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 | 0b11000000;
311 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
313 else if (from[i] > 0b0000011111111111)
315 r[c++] = ((
Byte*)&from[i])[1] >> 4 | 0b11100000;
316 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 & 0b00111111 | 0b10000000;
317 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
330 template<
typename N = UInt_64>
337 for (N i = 0; i < from.
Size(); ++i)
339 if (from[i] & 0b1101100000000000 && i + 1 < from.
Size() && from[i] & 0b1101110000000000)
341 r[c++] = ((
Byte*)&from[i])[1] & 00000111 | 0b11110000;
342 r[c++] = ((
Byte*)&from[i])[0] >> 2 & 0b00111111 | 0b10000000;
343 r[c++] = ((
Byte*)&from[i])[0] << 4 | (((
Byte*)&from[i + 1])[1] & 0b00000011) << 2 | ((
Byte*)&from[i + 1])[0] >> 6 & 0b00111111 | 0b10000000;
344 r[c++] = ((
Byte*)&from[++i])[0] & 0b00111111 | 0b10000000;
346 else if (from[i] <= 0b11111111)
348 r[c++] = (
Byte)from[i];
350 else if (from[i] > 0b11111111 && from[i] <= 0b0000011111111111)
352 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 | 0b11000000;
353 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
355 else if (from[i] > 0b0000011111111111)
357 r[c++] = ((
Byte*)&from[i])[1] >> 4 | 0b11100000;
358 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 & 0b00111111 | 0b10000000;
359 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
373 template<
typename N = UInt_64>
382 for (N i = 0; i < rSize; ++i)
384 if (from[i] <= 0b11111111)
388 else if (from[i] > 0b11111111 && from[i] <= 0b0000011111111111)
390 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 | 0b11000000;
391 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
393 else if (from[i] > 0b0000011111111111 && from[i] <= 0b1111111111111111)
395 r[c++] = ((
Byte*)&from[i])[2] << 2 | ((
Byte*)&from[i])[1] >> 6 | 0b11100000;
396 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 & 0b00111111 | 0b10000000;
397 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
399 else if (from[i] > 0b1111111111111111)
401 r[c++] = ((
Byte*)&from[i])[3] << 2 | ((
Byte*)&from[i])[3] >> 2 & 0b00000111 | 0b11110000;
402 r[c++] = ((
Byte*)&from[i])[2] << 2 | ((
Byte*)&from[i])[2] >> 6 & 0b00111111 | 0b11100000;
403 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[1] >> 6 & 0b00111111 | 0b10000000;
404 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
417 template<
typename N = UInt_64>
424 for (N i = 0; i < from.
Size(); ++i)
426 if (from[i] <= 0b11111111)
430 else if (from[i] > 0b11111111 && from[i] <= 0b0000011111111111)
432 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 | 0b11000000;
433 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
435 else if (from[i] > 0b0000011111111111 && from[i] <= 0b1111111111111111)
437 r[c++] = ((
Byte*)&from[i])[2] << 2 | ((
Byte*)&from[i])[1] >> 6 | 0b11100000;
438 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[0] >> 6 & 0b00111111 | 0b10000000;
439 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
441 else if (from[i] > 0b1111111111111111)
443 r[c++] = ((
Byte*)&from[i])[3] << 2 | ((
Byte*)&from[i])[3] >> 2 & 0b00000111 | 0b11110000;
444 r[c++] = ((
Byte*)&from[i])[2] << 2 | ((
Byte*)&from[i])[2] >> 6 & 0b00111111 | 0b11100000;
445 r[c++] = ((
Byte*)&from[i])[1] << 2 | ((
Byte*)&from[i])[1] >> 6 & 0b00111111 | 0b10000000;
446 r[c++] = ((
Byte*)&from[i])[0] & 0b00111111 | 0b10000000;
static N Len(const T *const str)
Definition Str.h:1869
N Size(bool inBytes=false) const
Definition Str.h:523
const Byte * ToBytes() const
Definition Str.h:787
void Resize(const N newSize)
Definition Str.h:500
A helper class for converting between UTF8, 16 and 32.
Definition UTF.h:17
static Str< Char_32, N > To_32(const Str< Char_16, N > &from)
Definition UTF.h:56
static Str< Char_32, N > To_32(const Char_16 *const from, const N size=0)
Definition UTF.h:25
static Str< Char_8, N > To_8(const Char_16 *const from, const N size=0)
Definition UTF.h:287
static Str< Char_32, N > To_32(const Str< Char_8, N > &from)
Definition UTF.h:118
static Str< Char_16, N > To_16(const Str< Char_8, N > &from)
Definition UTF.h:250
static Str< Char_16, N > To_16(const Char_8 *const from, const N size=0)
Definition UTF.h:212
static Str< Char_8, N > To_8(const Char_32 *const from, const N size=0)
Definition UTF.h:374
static Str< Char_16, N > To_16(const Str< Char_32, N > &from)
Definition UTF.h:180
static Str< Char_16, N > To_16(const Char_32 *const from, const N size=0)
Definition UTF.h:147
static Str< Char_8, N > To_8(const Str< Char_32, N > &from)
Definition UTF.h:418
static Str< Char_8, N > To_8(const Str< Char_16, N > &from)
Definition UTF.h:331
static Str< Char_32, N > To_32(const Char_8 *from, const N size=0)
Definition UTF.h:88
char32_t Char_32
Definition Types.h:42
char Char_8
Definition Types.h:40
unsigned char Byte
Definition Types.h:39
wchar_t Char_16
Definition Types.h:41
CharEncoding
Definition UTF.h:9
@ UTF_16
Definition UTF.h:11
@ UTF_32
Definition UTF.h:10
@ UTF_8
Definition UTF.h:12