почему кодировка UTF-8 кодовых точек Unicode не может уместиться в 3 байта - PullRequest
0 голосов
/ 21 февраля 2019

Википедия

Unicode содержит 1114112 кодовых точек в диапазоне от 0hex до 10FFFFhex

Я немного озадачен тем, что кодировка Unicode может занятьдо 4 байтов.Не могли бы 1114112 кодовых точек удобно уместиться в 3 байта?Может быть, я пропускаю некоторые особые ситуации, когда требуется 4 байта;пожалуйста, конкретный пример, если таковой имеется?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

«Юникод» не является кодировкой.Общими кодировками для 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, но 0100_0001 bin ( 41 hex ) - более короткая последовательность.

Ref: https://en.wikipedia.org/wiki/UTF-8

0 голосов
/ 21 февраля 2019

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

Юникод не является кодировкой.Нет смысла иметь размер для кодовой точки 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, но такжеo с UTF-16 вы часто имеете всего 2 байта (а не 4).

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

0 голосов
/ 21 февраля 2019

В статье Википедии об истории 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 лет.Удачи.

...