Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Разница между Unicode и UTF8.

kh fjkg Знаток (323), закрыт 3 года назад
Да, читал что это как сравнивать яблоки и апельсины, но хочется без фруктов в вопросе разобраться.

Вот таблица Unicode.
http://foxtools.ru/Unicode
Таблица Unicode содержит 65536 символов, это до двух Байт.

UTF8 может хранить символы от двух до четырёх Байт.
--------
UTF8 это те же самые 65536 Unicode символов, но хранятся от двух до четырёх Байт?
То есть самый последний символ Unicode 65536, который в Unicode занимает 2 Байта, в UTF8 будет храниться в 4 Байтах?
Лучший ответ
Лайт Ягами Искусственный Интеллект (313935) 3 года назад
Ну во-первых, в юникоде 65536 символов содержит только первая плоскость, называемая Basic Multilingual Plane. И в UTF-8 последний символ из BMP (U+FFFF) занимает 3 байта, а не 4. Но последующие (за пределами BMP) занимают по 4 байта.
kh fjkgЗнаток (323) 3 года назад
Плоскость 0 (0000—FFFF): Основная многоязычная плоскость (англ. Basic Multilingual Plane, BMP)
-----------------------
FFFF Два Байта из Юникода кодируются в UTF8 и получается 3 Байта в UTF8 ?
Лайт Ягами Искусственный Интеллект (313935) kh fjkg, да, именно так. Но это касается не любых символов, а в диапазоне от U+800 до U+FFFF
kh fjkgЗнаток (323) 3 года назад
Может знаете как декодировать символы из Unicode в UTF8?
Или из десятичной системы в UTF8.
Например есть символ 'Ж'
https://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
HEX код этого символа D096
Как его перевести в UTF8?

Я пытался по инструкции сделать, но там такая инструкция на википедии что ничего не понятно.
https://ru.m.wikipedia.org/wiki/UTF-8
-------------------------
>>110xxxxx — если для кодирования потребуется два октета;

d0==1101 0000
Здесь и так 110 в старших битах. Что ещё надо.
----------
>>3. Установить значащие биты октетов в соответствии с номером символа Юникода, выраженном в двоичном виде.
-------------------------
Как третий пункт выполнить?)
Лайт Ягами Искусственный Интеллект (313935) kh fjkg, код Ж - это U+0416. 'D0 96' - это в UTF-8 он так кодируется.
kh fjkgЗнаток (323) 3 года назад
Так вполне понятно)
Почему именно шестой бит с конца?
Не отрезать наверное, а разделить по границе шестого бита с конца.
kh fjkgЗнаток (323) 3 года назад
При трёх и четырёх октетах правила меняются?
Лайт Ягами Искусственный Интеллект (313935) kh fjkg, придётся либо 2 раза взять с конца по 6 битов, либо 3 раза. А старшие биты во всех случаях у "хвостов" будут 10, а у начального байта - либо 1110, либо 11110 (именно по начальному байту декодер определяет, сколько у нас всего октетов)
kh fjkgЗнаток (323) 3 года назад
Эмм, как вы из этого U+0416 получали старшие биты?

Я использовал для этих целей HEX код символа: D096
HEX D0==1101 0000
HEX 96==1001 0110
Лайт Ягами Искусственный Интеллект (313935) kh fjkg, D0 96 это уже последовательность в UTF-8, тебе нужно раскодировать её, а не закодировать.
kh fjkgЗнаток (323) 3 года назад
Я думал сначала что надо старшие биты существующих Байтов брать и копировать в код.
А там оказывается всегда 10 копировать надо.
О, так ещё легче)
-------------------
>>Если для кодирования требуется больше одного октета, то в октетах 2-4 два старших бита всегда устанавливаются равными 10 (10xxxxxx). Это позволяет легко отличать первый октет в потоке, потому что его старшие биты никогда не равны 10
Лайт Ягами Искусственный Интеллект (313935) kh fjkg, в википедии же таблица удобная есть, где легко видно, какие последовательности байтов могут встретиться в UTF-8 строке:
kh fjkgЗнаток (323) 3 года назад
D096 в Десятичном виде это 53398
А в таблице https://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm указано что 208 150
Лайт Ягами Искусственный Интеллект (313935) kh fjkg, зачем в десятичный вид переводить? В нём считать неудобно
kh fjkgЗнаток (323) 3 года назад
Ну в принципе и этого достаточно. Ради интереса может или чтоб чтото новое узнать)
kh fjkgЗнаток (323) 3 года назад
Можете ответить последний раз?)
Как найти значащие биты октетов?
Почему именно 6 Байт с конца отсчитывать надо?
kh fjkgЗнаток (323) 3 года назад
*6 бит с конца
Остальные ответы
serd Просветленный (20240) 3 года назад
Unicode присваивает каждому символу номер.
UTF-8 - кодировка. Определяет как символы (номера) кодируются - т. е. как номер символа сохраняется в файле, передается через интернет и т. д.
Сергей Гений (59916) 3 года назад
Теоретически то UTF-8 в два байта может хранить овер дохрена символов. Но часть бит уходит на всякую служебную информацию и резерв. Поэтому эта таблица хоть и занимает 2 байта, но в двухбайтный UTF не поместится.
Если посмотреть UTF в HEX редакторе он не будет совпадать с таблицей. Есть специальные алгоритмы преобразования.
Иван Сигаев Искусственный Интеллект (155175) 3 года назад
Сравниваем непонятно откуда взятую неверную формулировку:
UTF8 может хранить символы от двух до четырёх Байт.
с взятой из википедии
UTF-8 - распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII.

PS: UTF-8 в 4 октетах может закодировать 1114112 символов
kh fjkgЗнаток (323) 3 года назад
>> позволяющий более компактно хранить и передавать символы Юникода
Тогда почему FFFF Юникода хранится в трёх Байтах UTF8 если UTF8 более компактен?
Иван Сигаев Искусственный Интеллект (155175) Потому, что переменное количество байт например U+0020 хранится в одном байте
kh fjkgЗнаток (323) 3 года назад
https://ru.m.wikipedia.org/wiki/UTF-8
Как найти значащие биты октетов?
Почему именно 6 бит с конца отсчитывать надо?
Иван Сигаев Искусственный Интеллект (155175) Возьмем для примера F0 9F 98 87 11110000 10011111 10011000 10000111 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 000 011111 011000 000111 000011111011000000111 1F607 ????
kh fjkgЗнаток (323) 3 года назад
Мне немного (сильно) по другому объяснил Лайт Ягами.
Или я не так понял.
Кароче сейчас вообще ничего не понятно.

Вы ещё такие Байты подобрали у которых всё с таблицей совпадает.
Букву 'Ж' из Юникода я так например декодировал в UTF8:
https://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm'
416 это HEX код буквы 'Ж', это 10000010110 в бинарном виде.
Отсчитываем 6 бит с конца (хотя какого фига надо именно 6 бит отсчитывать не знаю) и делим это число на 2 части.
Получаем: 10000 010110
Перед первой частью ставим 110 как указано в таблице, перед второй частью ставим 10.
(110)10000 (10)010110
11010000 10010110 ==D096
------------------------------
Ваше объяснение я не понял.
Иван Сигаев Искусственный Интеллект (155175) Диапазон номеров символов -- Требуемое количество октетов 00000000-0000007F -- 1 00000080-000007FF -- 2 00000800-0000FFFF -- 3 00010000-0010FFFF -- 4 U+0416 - два октета ( по таблице ) Шаблон двух октетов 110xxxxx 10xxxxxx 10000010110 10000 010110 11010000 10010110 D0 96
kh fjkgЗнаток (323) 3 года назад
А, понял. Вы декодировали из UTF8 в Юникод.
1F607== 00 011111 011000 000111
Делим на 4 части и вставляем цифры из таблицы. 11110 и 10
Но непонятно почему 6 бит отсчитывать надо.
kh fjkgЗнаток (323) 3 года назад
Вот поделил на 4 части число 00 011111 011000 000111 остсчитывая по 6 бит с конца.
kh fjkgЗнаток (323) 3 года назад
Я понял как переводить туда и обратно. Непонятно другое.
Но непонятно почему 6 бит отсчитывать надо с конца двоичного числа чтоб поделить это число на части.
Иван Сигаев Искусственный Интеллект (155175) А чего непонятного? UTF-8 в первом октете кодирует количество октетов - получается у него переменная длина значащих бит, а остальные всегда имеют "заголовок" 10 и 6 значащих бит Делим число справа по 6 бит - получаем необходимые значения, "вставляем" в шаблон - получаем готовый UTF-8
kh fjkgЗнаток (323) 3 года назад
Вот блин я туплю. И правда. 6+2==8 А это Байт.
Похожие вопросы