mbstowcs в Mac OS X
От: The Lex Украина  
Дата: 12.01.11 21:27
Оценка:
Чего-то я не понимаю. Как ни кручу-верчу — на выходе у меня получается:

['A', 0, '1', 0, '2', 0, '3', '0' '0']


Насчет количества последних нулей не уверен — не смотрел до конца. Это — в wchar_t значениях. Я что-то снова запутался в UNICODE: что это за вариант Юникода такой и как мне получить простой массив символов из мультибайтного UTF8? Где собака порылась?

Перетаскивать вайдчары по одному вручную?

ЗЫ: макось похоже 64-битная если что.
Голь на выдумку хитра, однако...
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
Re[2]: mbstowcs в Mac OS X
От: The Lex Украина  
Дата: 13.01.11 09:26
Оценка:
Здравствуйте, McQwerty, Вы писали:

TL>>Перетаскивать вайдчары по одному вручную?

MQ>
MQ>// Если нет __int8, то 
MQ>typedef unsigned char __int8;

MQ>bool utf8_to_ucs (const __int8* utf8, wchar_t* ucs) __THROW
MQ>


Не, ну существование rfc-шного декодинга понятно — все равно спасибо! Хотелось чего-то большого и чистого... А жизнь — ...

ЗЫ: задумавшись над правильными ключевыми словами поискал в залежах кода проекта по "utf8" и тут же нашел utf8_encodestr(...) Которая, правда, пока нигде не используется...

Ладно, придется таки "в лоб" — еще раз спасибо!
Голь на выдумку хитра, однако...
Re[3]: mbstowcs в Mac OS X
От: McQwerty Россия  
Дата: 13.01.11 09:50
Оценка:
Здравствуйте, The Lex, Вы писали:

TL>>>Перетаскивать вайдчары по одному вручную?

MQ>>
MQ>>bool utf8_to_ucs (const __int8* utf8, wchar_t* ucs) __THROW
MQ>>

TL>Не, ну существование rfc-шного декодинга понятно — все равно спасибо! Хотелось чего-то большого и чистого... А жизнь — ...

Ну, а чего ещё ожидать? Другого способа перекодировать utf8 в ucs нет: только побайтно. Можно реализовать самому, можно покапаться в АПИ, предоставляемом ОС, библиотеками или ещё чем. Существование специальной функции в Mac OS возможно, но её реализация не сильно будет отличаться от предложенной.
Re: mbstowcs в Mac OS X
От: MShura  
Дата: 13.01.11 10:28
Оценка:
TL>Насчет количества последних нулей не уверен — не смотрел до конца. Это — в wchar_t значениях. Я что-то снова запутался в UNICODE: что это за вариант Юникода такой и как мне получить простой массив символов из мультибайтного UTF8? Где собака порылась?

Если hfs хранит имена в том юникоде, который "родной" для мака, то этот юникод не такой как в windows.
Re[3]: mbstowcs в Mac OS X
От: Кодёнок  
Дата: 13.01.11 12:17
Оценка:
Здравствуйте, The Lex, Вы писали:

TL>ЗЫ: задумавшись над правильными ключевыми словами поискал в залежах кода проекта по "utf8" и тут же нашел utf8_encodestr(...) Которая, правда, пока нигде не используется...


Правильные ключевые слова:

UTF-16
Little Endian
UTF-8

Тебе нужна перекодировка из utf-16 little endian в utf8. Гугл и википедия в помощь.

p.s. ucs-2 это устаревшее название utf-16. "wide char" и "ucs" это сокращения, некорректные вне контекста, обычно означающие “utf-16 with native byte order”.
Re[4]: mbstowcs в Mac OS X
От: Peregrin  
Дата: 13.01.11 14:24
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>p.s. ucs-2 это устаревшее название utf-16.


Не совсем, в UCS-2 один code point это всегда 16 бит, в utf-16 может быть и больше, но кратно 16. Идентичны они только при кодировании code points в диапазонах U+0000..U+D7FF и U+E000..U+FFFF.
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re[4]: mbstowcs в Mac OS X
От: hattab  
Дата: 13.01.11 14:26
Оценка: 3 (1) +2
Здравствуйте, Кодёнок, Вы писали:

К> p.s. ucs-2 это устаревшее название utf-16. "wide char" и "ucs" это сокращения, некорректные вне контекста, обычно означающие “utf-16 with native byte order”.


Нет, UCS-2 и UTF-16 совершенно разные кодировки. UCS-2 это только BMP диапазон (65536 codepoints), а UTF-16 это BMP + Supplementary (1 114 111 codepoints). Поэтому для UCS-2 длина символа всегда 2 байта, а для UTF-16 она можеть быть, либо 2, либо 4 байта (для представления диапазона supplementary используются суррогатные пары)
avalon 1.0rc3 rev 380, zlib 1.2.3
Re[4]: mbstowcs в Mac OS X
От: The Lex Украина  
Дата: 13.01.11 16:23
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Тебе нужна перекодировка из utf-16 little endian в utf8. Гугл и википедия в помощь.


Мне подошла уже имеющаяся в "базе кода проекта" перекодировка "UTF8 в UTF16". Вроде little endian...
Голь на выдумку хитра, однако...
Re[2]: mbstowcs в Mac OS X
От: Аноним  
Дата: 02.07.11 08:12
Оценка:
utf8_to_ucs всегда возвращает false
Re: mbstowcs в Mac OS X
От: uzhas Ниоткуда  
Дата: 02.07.11 09:54
Оценка:
Здравствуйте, The Lex, Вы писали:

TL>Чего-то я не понимаю. Как ни кручу-верчу — на выходе у меня получается:


TL>
TL>['A', 0, '1', 0, '2', 0, '3', '0' '0']
TL>

откуда вы взяли этот выход? в дебугере посмотрели? видно, что вы его руками набивали и могли ошибиться. было бы хорошо, если бы привели фрагмент кода, какая строка на входе, какая на выходе, какая теущая локаль, какой sizeof(wchar_t) и тд.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.