Почему существует UTF-32, тогда как для кодирования каждого символа требуется всего 21 бит? - PullRequest
24 голосов
/ 14 июня 2011

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

Ответы [ 4 ]

21 голосов
/ 14 июня 2011

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

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

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

4 голосов
/ 22 октября 2017

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

Позже выяснилось, что использование только 65536 кодовых точек UCS-2 в любом случае может привести к проблемам, но многие программы (Windows, кашель ) полагались на широкие символы шириной 16 бит, поэтому UTF -16 был создан. UTF-16 обычно кодирует значение U+0000 - U+FFFF; и 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 используется в качестве представления в памяти для текста в программах, которым требуется просто индексированный доступ к кодовым точкам - это кодировка only , где N-й элемент в массиве C также N-я кодовая точка - UTF-24 сделал бы то же самое для 25% экономии памяти, но для более сложных обращений к элементам.

2 голосов
/ 14 июня 2011

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

1 голос
/ 14 июня 2011

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

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

...