Здравствуйте, The Lex, Вы писали:
TL>Чего-то я не понимаю. Как ни кручу-верчу — на выходе у меня получается:
TL>TL>['A', 0, '1', 0, '2', 0, '3', '0' '0']
TL>
TL>Насчет количества последних нулей не уверен — не смотрел до конца. Это — в wchar_t значениях. Я что-то снова запутался в UNICODE: что это за вариант Юникода такой и как мне получить простой массив символов из мультибайтного UTF8? Где собака порылась?
TL>Перетаскивать вайдчары по одному вручную?
// Если нет __int8, то
typedef unsigned char __int8;
bool utf8_to_ucs (const __int8* utf8, wchar_t* ucs) __THROW
{
bool retcode = false;
int j = 0;
while (utf8 [j])
{
char ch = utf8 [j];
if (0x80 & ch)
{
if (0x40 & ch)
{
if (0x20 & ch)
{
/* consume 3 */
if ((utf8 [j + 1] == 0) || (utf8 [j + 2] == 0))
{
break;
}
if
(
(utf8[j+1] & 0x40) || !(utf8[j+1] & 0x80) ||
(utf8[j+2] & 0x40) || !(utf8[j+2] & 0x80)
)
{
retcode = false;
}
const wchar_t symbol = (wchar_t)
(
((ch & 0x0F) << 12) |
((utf8 [j + 1] & 0x3F) << 6) |
((utf8 [j + 2] & 0x3F))
);
j += 3;
* ucs ++ = symbol;
}
else
{
/* consume 2 */
if (utf8 [j + 1] == 0)
{
break;
}
if ((utf8[j+1] & 0x40) || !(utf8[j+1] & 0x80))
{
retcode = false;
}
const wchar_t symbol = (wchar_t)
(
((ch & 0x1F) << 6) |
((utf8 [j + 1] & 0x3F))
);
j += 2;
* ucs ++ = symbol;
}
}
else
{
/* consume 1 (error) */
retcode = false;
j ++;
}
}
else
{
/* consume 1 */
if (ch)
{
* ucs ++ = (wchar_t) ch;
}
j++;
}
}
* ucs = 0;
return retcode;
} // utf8_to_ucs