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

Что такое "суррогатная пара" на Java?

Я читал документацию для StringBuffer, в частности метод reverse(). В этой документации упоминается что-то о суррогатных парах. Что такое суррогатная пара в этом контексте? А что такое низкие и высокие суррогаты?

4b9b3361

Ответ 1

Термин "суррогатная пара" относится к способу кодирования символов Unicode с высокими кодовыми точками в схеме кодирования UTF-16.

В кодировке символов Юникод символы отображаются в значения от 0x0 до 0x10FFFF.

Внутренне, Java использует схему кодирования UTF-16 для хранения строк текста Юникода. В UTF-16 используются 16-битные (двухбайтовые) кодовые единицы. Поскольку 16 бит могут содержать только диапазон символов от 0x0 до 0xFFFF, для хранения значений выше этого диапазона (0x10000 до 0x10FFFF) используется дополнительная сложность. Это делается с использованием пар блоков кода, известных как суррогаты.

Суррогатные единицы кода находятся в двух диапазонах, известных как "высокие суррогаты" и "низкие суррогаты", в зависимости от того, разрешены ли они в начале или конце последовательности двух кодовых блоков.

Ответ 2

Ранние версии Java представляли символы Unicode с использованием 16-разрядного типа данных char. Эта конструкция имела смысл в то время, потому что все символы Юникода имели значения менее 65535 (0xFFFF) и могут быть представлены в 16 бит. Позднее, однако, Unicode увеличил максимальное значение до 1,114,111 (0x10FFFF). Поскольку 16-битовые значения были слишком малы для представления всех символов Юникода в Unicode версии 3.1, для схемы кодирования UTF-32 были приняты 32-битные значения - называемые кодовыми точками. Но 16-битные значения предпочтительны для 32-битных значений для эффективного использования памяти, поэтому Unicode представил новую конструкцию, позволяющую продолжать использовать 16-битные значения. Эта схема, принятая в схеме кодирования UTF-16, присваивает 1024 байта высоким 16-битным суррогатам (в диапазоне U + D800 до U + DBFF), а еще 1024 значения - 16-битным низким суррогатам (в диапазоне U + DC00 к U + DFFF). Он использует высокий суррогат, за которым следует низкий суррогат - суррогатная пара - для представления (продукт 1,024 и 1,024) 1,048,576 (0x100000) значений между 65 536 (0x10000) и 1,114,111 (0x10FFFF).

Ответ 3

В этой документации указывается, что недопустимые строки UTF-16 могут стать действительными после вызова метода reverse, поскольку они могут быть обратными действительными строками. Суррогатная пара (обсуждаемая здесь) представляет собой пару 16-битных значений в UTF-16, которые кодируют одну кодовую точку Unicode; низкий и высокий суррогаты являются двумя половинами этого кодирования.

Ответ 5

Суррогатная пара - это два "кодовых блока" в UTF-16, которые составляют одну "кодовую точку". Документация Java заявляет, что эти "кодовые точки" будут по-прежнему действительны, а их "кодовые единицы" упорядочены правильно, после обратного. В нем также говорится, что два непарных суррогатных единиц кода могут быть отменены и образуют действительную суррогатную пару. Это означает, что если есть непарные кодовые единицы, тогда есть вероятность, что обратная сторона обратного хода может быть не такой!

Обратите внимание, что в документации ничего не говорится о Graphemes, которые объединяют несколько кодовых точек. Это означает, что e и акцент, который идет вместе с ним, все еще могут быть переключены, тем самым помещая акцент перед e. Это означает, что если есть другой гласный перед e, он может получить акцент, который был на e.

Хлоп!