Подтвердить что ты не робот

Почему существует UTF-32, тогда как для кодирования каждого символа требуется только 21 бит?

Мы знаем, что кодовые точки могут находиться в этом интервале 0..10FFFF, который меньше 2 ^ 21. Тогда зачем нам UTF-32, когда все кодовые точки могут быть представлены 3 байтами? UTF-24 должно быть достаточно.

4b9b3361

Ответ 1

Две причины, о которых я могу думать:

  • Он позволяет для будущего расширения
  • (Что еще более важно). Компьютеры, как правило, намного лучше справляются с данными на 4 байтовых границах. Преимущества с точки зрения сокращения потребления памяти относительно малы по сравнению с болью при работе с 3-байтовыми границами.

Я думаю, это немного напоминает вопрос, почему у нас часто есть 8-битные, 16-битные, 32-битные и 64-разрядные целые типы данных (байты, int, long, whatever), но не 24-битные. Я уверен, что есть много случаев, когда мы знаем, что число никогда не будет превышать 2 21 но просто проще использовать int, чем создать 24-битный тип.

Ответ 2

Сначала были две схемы кодирования символов: UCS-4, который кодировал каждый символ в 32 бита, как целое число без знака в диапазоне 0x00000000 - 0x7FFFFFFF, и UCS-2, который использовал 16 бит для каждой кодовой точки.

Позже выяснилось, что использование только 65536 кодовых точек UCS-2 в любом случае может привести к проблемам, но многие программы (Windows, кашель) полагались на широкие символы шириной 16 бит, поэтому был создан UTF-16. UTF-16 кодирует кодовые точки в диапазоне U+0000 - U+FFFF точно так же, как UCS-2; и U+10000 - U+10FFFF с использованием суррогатных пар, то есть пары двух 16-битных значений.

Поскольку это было немного сложно, был представлен UTF-32, как простое взаимно-однозначное отображение символов за пределами U+FFFF. Теперь, поскольку UTF-16 может кодировать только до U+10FFFF, было решено, что это будет максимальное значение, которое когда-либо будет назначено, так что больше не будет проблем совместимости, поэтому UTF-32 действительно использует только 21 биты. В качестве дополнительного бонуса UTF-8, который изначально планировался как кодирование в 1-6 байт, теперь никогда не требует более 4 байтов для каждой кодовой точки. Поэтому можно легко доказать, что для него никогда не требуется больше памяти, чем для UTF-32.

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

Но UTF-32 используется как представление в памяти для текста в программах, которым требуется просто индексированный доступ к кодовым точкам - это только кодировка, где N-й элемент в массиве C также является N-й кодовой точкой - UTF-24 сделал бы то же самое для 25% экономии памяти, но более сложного доступа к элементам.

Ответ 3

Это правда, что требуется только 21 бит (ссылка), но современные компьютеры умеют перемещать 32-битные единицы вещей вокруг и вообще взаимодействуя с ними. Я не думаю, что когда-либо использовал язык программирования с 24-битным целым или символьным типом, а также платформу, где это было кратно размерному размеру процессора (не так как я в последний раз использовал 8-разрядный компьютер, UTF -24 был бы разумным на 8-битной машине), хотя, естественно, были некоторые.

Ответ 4

UTF-32 является кратным 16 бит. Работа с 32-битными количествами намного более распространена, чем работа с 24-битовыми количествами и обычно лучше поддерживается. Это также помогает поддерживать выравнивание каждого символа на 4 байта (при условии, что вся строка выравнивается по 4 байт). Переход от 1 байт до 2 байтов в 4 байта является наиболее "логическим" процессом.

Кроме того: стандарт Unicode постоянно растет. В конечном итоге могут быть назначены кодовые обозначения вне этого диапазона (в ближайшем будущем это несколько маловероятно, из-за того, что все еще доступно огромное количество неназначенных кодовых точек).