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

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

5 ответов


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

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

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

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


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


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


суррогатные пары относятся к способу кодирования определенных символов UTF-16, см. http://en.wikipedia.org/wiki/UTF-16/UCS-2#Code_points_U.2B10000..U.2B10FFFF


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

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

Yikes!