Сначала были две схемы кодирования символов: 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% экономии памяти, но для более сложных обращений к элементам.