почему кодировка UTF-8 кодовых точек Unicode не может уместиться в 3 байта

Добавить переполнение: автоматически в контейнер div. http://www.quirksmode.org/css/clearing.html Этот сайт показывает несколько вариантов при возникновении этой проблемы.

1
задан Saturday Sherpa 21 February 2019 в 16:55
поделиться

3 ответа

В статье Википедии об истории UTF-8 говорится, что более ранняя версия UTF-8 позволяла кодировать более 21 бита. Эти кодировки занимали 5 или даже 6 байтов.

После того, как стало ясно, что 2 ^ 21 кодовых точек, вероятно, будет достаточно для оставшегося времени человечества (то же самое, что и с 5 битами, 6 битами, 7 битами, 8 битами и 16 битами), кодировки для 5 и для 6 байт были просто запрещены. Все остальные правила кодирования были сохранены для обратной совместимости.

Как следствие, числовое пространство для кодовых точек Unicode теперь равно 0..10FFFF, что даже немного меньше 21 бита. Поэтому, возможно, стоит проверить, соответствуют ли эти 21 бит 24 битам по 3 байта вместо текущих 4 байтов.

Одним важным свойством UTF-8 является то, что каждый байт, который является частью многобайтового кодирования, имеет свой самый высокий установленный бит. Чтобы отличить старший байт от конечных байтов, у старшего байта установлен второй старший бит, а у конечных байтов очищен второй старший бит. Это свойство обеспечивает последовательный порядок. Поэтому символы могут быть закодированы следующим образом:

0xxx_xxxx                        7 bits freely chooseable
110x_xxxx 10xx_xxxx             11 bits freely chooseable
1110_xxxx 10xx_xxxx 10xx_xxxx   16 bits freely chooseable

Теперь 7 + 11 + 16 бит = 16,04 бит, что намного короче, чем требуется 21 бит. Поэтому кодирование всех кодовых точек Unicode с использованием до 3 байтов на текущие правила кодирования UTF-8 невозможно.

Вы можете определить другое кодирование, где старший бит каждого байта является битом продолжения:

0xxx_xxxx                        7 bits freely chooseable
1xxx_xxxx 0xxx_xxxx             14 bits freely chooseable
1xxx_xxxx 1xxx_xxxx 0xxx_xxxx   21 bits freely chooseable

Теперь у вас достаточно места для кодирования всех 21-битных кодовых точек. Но это совершенно новая кодировка, поэтому вам придется установить это по всему миру. Учитывая опыт работы с Unicode, это займет около 20 лет. Удачи.

0
ответ дан Roland Illig 21 February 2019 в 16:55
поделиться

Я расширяю свой комментарий.

Юникод не является кодировкой. Нет смысла иметь размер для кодовой точки Unicode. Unicode - это отображение между кодовой точкой и семантическим именем (например, «LATIN CAPITAL LETTER A»). Вы можете выбрать свою собственную кодировку.

Изначально Unicode хотел быть универсальным кодированием, которое бы вписывалось в 16-битный формат (то есть Unification Японский / Китайский) Как видите, это не удалось на этой цели. И второй момент (очень важный) - возможность конвертировать в Unicode и обратно без потери данных (это упрощает конвертацию в Unicode: по одному инструменту за раз, на любом слое).

Итак, возникла проблема с тем, как расширить Unicode для поддержки более чем 16-разрядных, но в то же время, чтобы не сломать все программы Unicode. Идея заключалась в том, чтобы использовать суррогаты, чтобы программы, которые просто знают о 16-битном Unicode (UCS-2), все еще могли работать (и BTW python2, а Javascript знают только UCS-2, и они все еще работают хорошо. Язык не должен знать что кодовые точки Unicode могут иметь более 16 битов.

Суррогаты дают верхний предел фактического Unicode (поэтому не равны степени 2).

Позже он был разработан UTF-8. характеристика (по конструкции): совместимость с ASCII (для 7-битных символов), кодирование всех кодовых точек (также> 16-битных) и возможность перехода в случайную позицию и быстрой синхронизации в месте начала символа. некоторого адресного пространства, поэтому текст не такой плотный, как может быть, но он гораздо более практичен (и быстро "прокручивает" файлы). Эти дополнительные данные (для синхронизации) сделали невозможным кодирование всех новых кодовых точек Unicode в 3 байтов, с UTF-8.

Вы можете использовать UTF-24 (см. комментарий), но вы потеряете преимущество UFT-8, чтобы быть совместимым с ASCII, но также и с UTF-16 у вас часто есть всего 2 байта (а не 4).

Помните: кодовая точка Unicode выше 16 бит более редкая: древние языки, лучшее представление (семантическая) существующих символов или новые эмоджи (который, мы надеемся, не заполняет весь длинный текст только смайликами). Таким образом, утилита из 3 байтов (пока) не нужна. Возможно, если инопланетяне придут на Землю, и нам следует писать с их новыми языковыми символами, мы будем использовать в основном кодовую точку Unicode выше 16 бит. Думаю, не скоро это случится.

0
ответ дан Giacomo Catenazzi 21 February 2019 в 16:55
поделиться

«Юникод» не является кодировкой. Общими кодировками для Unicode являются UTF-8, UTF-16 и UTF-32. UTF-8 использует 1-, 2-, 3- или 4-байтовые последовательности и объясняется ниже. Это накладные расходы на ведущие / конечные битовые последовательности, которые требуют 4 байта для 21-битного значения.

Кодирование UTF-8 использует до 4 байтов для представления кодовых точек Unicode с использованием следующих битовых комбинаций:

1-байтовый UTF-8 = 0xxxxxxx bin = 7 бит = U + 0000 до U + 007F
2-байтовый UTF-8 = 110xxxxx 10xxxxxx bin = 11 бит = U + 0080 в U + 07FF
3-байтовый UTF-8 = 1110xxxx 10xxxxxx 10xxxxxx bin = 16 бит = U + 0800 в U + FFFF
4-байтовый UTF-8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx bin = 21 бит = U + 10000 до U + 10FFFF

Преимущество UTF- 8 - ведущие байты - это уникальные шаблоны, а завершающие байты - это уникальные шаблоны, которые позволяют легко проверить правильность последовательности UTF-8.

Обратите внимание, что запрещено использовать более длинную кодировку для значения Unicode, которое вписывается в меньшую последовательность. Например:

1100_0001 1000_0001 bin или C1 81 hex кодирует U + 0041, но [ 1117] 0100_0001 bin ( 41 hex ) - более короткая последовательность.

Ссылка: https://en.wikipedia.org/wiki/UTF-8

0
ответ дан Mark Tolonen 21 February 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: