powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / WideCharToMultiByte. Как оно работает?
5 сообщений из 5, страница 1 из 1
WideCharToMultiByte. Как оно работает?
    #37398386
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понадобилось такое в 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
WideCharToMultiByte. Как оно работает?
    #37398445
Фотография ljnk05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WideCharToMultiByte. Как оно работает?
    #37398456
Фотография ljnk05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше оно на юникоде.орг было

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
WideCharToMultiByte. Как оно работает?
    #37398459
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ljnk05,

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


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