Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / WideCharToMultiByte. Как оно работает? / 5 сообщений из 5, страница 1 из 1
16.08.2011, 19:30
    #37398386
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte. Как оно работает?
Понадобилось такое в JS, придется, видимо, реализовывать.. Юникодные символы с кодом больше 0x7F надо неким образом разбирать на байты.
Как работает?

Есть упрощенный вариант, подходит для кириллицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var str = 'Аб0', arr = [];
 for (var i= 0 ; i<str.length; ++i) {
    var code = str.charCodeAt(i); // utf8 код символа. Например, для нашей А будет 1040
     if (code <= 0x7F) {
        arr.push(code);
    }  else  {
        arr.push(0xC0 | (( code >>  6 ) & 0x1F), 0x80 | (code & 0x3F));
    }
}
alert(arr.join(',')); // 208,144,208,177,48

Но в строке может оказаться клинопись с хз сколько байт на символ. Что с ними делать?
...
Рейтинг: 0 / 0
16.08.2011, 20:41
    #37398445
ljnk05
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte. Как оно работает?
U-00000000 – U-0000007F: 0xxxxxxx
U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
...
Рейтинг: 0 / 0
16.08.2011, 20:46
    #37398456
ljnk05
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte. Как оно работает?
Раньше оно на юникоде.орг было

http://www.koders.com/c/fid39AE071FDC4C990EA35773A29AF0EE2C5F79DF03.aspx

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
/* ================================================================ */
ConversionResult ConvertUCS4toUTF8 ( UCS4** sourceStart, const UCS4* sourceEnd, 
                                     UTF8** targetStart, const UTF8* targetEnd)
{
  ConversionResult result = ok;
  register UCS4* source = *sourceStart;
  register UTF8* target = *targetStart;
  while (source < sourceEnd) {
    register UCS4 ch;
    register unsigned short bytesToWrite =  0 ;
    register const UCS4 byteMask = 0xBF;
    register const UCS4 byteMark = 0x80; 
    ch = *source++;
    if (ch >= kSurrogateHighStart && ch <= kSurrogateHighEnd
        && source < sourceEnd) {
      register UCS4 ch2 = *source;
      if (ch2 >= kSurrogateLowStart && ch2 <= kSurrogateLowEnd) {
        ch = ((ch - kSurrogateHighStart) << halfShift)
          + (ch2 - kSurrogateLowStart) + halfBase;
        ++source;
      };
    };
    if (ch < 0x80) {                            bytesToWrite =  1 ;
    } else if (ch < 0x800) {            bytesToWrite =  2 ;
    } else if (ch < 0x10000) {          bytesToWrite =  3 ;
    } else if (ch < 0x200000) {         bytesToWrite =  4 ;
    } else if (ch < 0x4000000) {        bytesToWrite =  5 ;
    } else if (ch <= kMaximumUCS4){     bytesToWrite =  6 ;
    } else {                                            bytesToWrite =  2 ;
    ch = kReplacementCharacter;
    }; /* I wish there were a smart way to avoid this conditional */
                
    target += bytesToWrite;
    if (target > targetEnd) {
      target -= bytesToWrite; result = targetExhausted; break;
    };
    switch (bytesToWrite) {     /* note: code falls through cases! */
      case  6 :   *--target = (ch | byteMark) & byteMask; ch >>=  6 ;
      case  5 :   *--target = (ch | byteMark) & byteMask; ch >>=  6 ;
      case  4 :   *--target = (ch | byteMark) & byteMask; ch >>=  6 ;
      case  3 :   *--target = (ch | byteMark) & byteMask; ch >>=  6 ;
      case  2 :   *--target = (ch | byteMark) & byteMask; ch >>=  6 ;
      case  1 :   *--target =  ch | firstByteMark[bytesToWrite];
    };
    target += bytesToWrite;
  };
  *sourceStart = source;
  *targetStart = target;
  return result;
};
...
Рейтинг: 0 / 0
16.08.2011, 20:48
    #37398459
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte. Как оно работает?
ljnk05,

спасибо. буду раскуривать.
...
Рейтинг: 0 / 0
16.08.2011, 20:50
    #37398463
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WideCharToMultiByte. Как оно работает?
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / WideCharToMultiByte. Как оно работает? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]