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

Что именно делает String.codePointAt?

Недавно я столкнулся с codePointAt методом String в Java. Я также нашел несколько других методов codePoint: codePointBefore, codePointCount и т.д. Они определенно имеют какое-то отношение к Unicode, но я этого не понимаю.

Теперь мне интересно, когда и как следует использовать codePointAt и подобные методы.

4b9b3361

Ответ 1

Краткий ответ: он дает вам кодовую точку Unicode, которая начинается с указанного индекса в String. то есть "номер юникода" символа в этой позиции.

Более длинный ответ: Java была создана, когда 16-битный (он же char) был достаточен для хранения любого существующего символа Юникода (эти части теперь известны как Базовая многоязычная плоскость или BMP). Позже Unicode был расширен, чтобы включить символы с кодовой точкой> 2 16. Это означает, что char больше не может содержать все возможные кодовые точки Unicode.

Решением было UTF-16: он хранит "старые" кодовые точки Unicode в 16 битах (т.е. ровно один char), а все новые - в 32 битах (т.е. два значения char). Эти два 16-битных значения называются "суррогатная пара". Теперь, строго говоря, char содержит "кодовую единицу UTF-16" вместо "символа Юникода", как это было раньше.

Теперь все "старые" методы (работа только с char) можно использовать очень хорошо, если вы не используете ни один из "новых" символов Юникода (или не заботитесь о них), но если вы заботитесь о новые символы (или просто необходимо иметь полную поддержку Unicode), тогда вам нужно будет использовать версии с "кодовой точкой", которые фактически поддерживают все возможные кодовые точки Unicode.

Примечание. Очень хорошо известным примером символов Юникода, которых нет в BMP (т. Е. Работают только при использовании варианта с кодовой точкой), являются эмодзи: даже простое Grinning Face 😀 U + 1F600 не может быть представлено в одном char.

Ответ 2

Кодовые точки поддерживают символы выше 65535, то есть Character.MAX_VALUE.

Если у вас есть текст с такими старшими символами, вы должны работать с кодовыми точками или int вместо char.

Это не поддерживается поддержкой UTF-16, которая может использовать один или два 16-битных символа и превращать их в int

AFAIK, Как правило, это требуется только для дополнительного Multiligual и дополнительные идеографических символов, добавленных в последнее время, такие как не традиционные китайские.

Ответ 3

Короче, пока вы используете кодировку по умолчанию в Java:) Но для более подробного объяснения попробуйте следующие сообщения:

Сравнение char с кодовой точкой? http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html http://javarevisited.blogspot.com/2012/01/java-string-codepoint-get-unicode.html

Надеюсь, это поможет вам прояснить ситуацию:)