Показать сообщение отдельно
  #8 (permalink)  
Старый 26.12.2011, 18:16
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от B@rmaley.e><e
utf82str — не то?
Ну вообще это реализация str2utf8. У них не учитываются 31-битные числа. За ссылку спасибо.

Сообщение от B@rmaley.e><e
Есть строка, разбираете по символам, узнаете код символа, а дальше что?
А дальше смотрим как кодировка UTF8 кодирует символы в байты. Это показано во второй таблице, по ссылке из первого поста.

Из этой таблице видно, что коды символов могут лежать в некоторых диапазонах. Допустим, если код символа меньше или равно 0x7ff, то символ кодируется одним байтом. Если больше, то несколькими (максимум 6 байт, последняя строка таблицы).

Рассмотрим символ ♫.
Его код 9835, или в бинарном представлении 00100110 01101011, т.е. 16 бит.
UTF8 кодирует 16-битные числа в трех байтах (см. табличку). Т.е. этот символ весит 3 байта, тогда как латинские буквы 1.

Смотрим на табличку:
1110xxxx 10xxxxxx 10xxxxxx

Здесь x - это 1 бит числа, которое мы хотим закодировать. Цифры - служебные биты.
Т.е. мы берём биты числа и раскладываем по нужным местам в соответствующем порядке:

11100010 10011001 10101011
Жирным выделены биты кода нашего символа. Собственно, этим и занимается ветка if(code <= 0xffff):
Сообщение от nerv_
Вижу битовые операторы, но логика их работы не понятна.
Берём нужные биты, двигаем на нужные места (в конец байта) и добавляем служебные в начало.

В итоге, мы получаем 3 байта (3 числа):
Первое: 11100010 - это 226 в десятичной системе.
Второе: 10011001 - это 153 в десятичной системе.
Третье: 10101011 - это 171 в десятичной системе.

Собственно, то что мы и наблюдаем в результирующем массиве.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием