Re: mbstowcs в Mac OS X
От: McQwerty Россия  
Дата: 13.01.11 08:55
Оценка: 3 (1)
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.