Что именно делает String.codePointAt?
Недавно я столкнулся с методом codePointAt String в Java. Я нашел также несколько других методов codePoint: codePointBefore
, codePointCount
и т.д. Они определенно имеют отношение к Unicode, но я не понимаю этого.
Теперь интересно, когда и как следует использовать codePointAt
и подобные методы.
4 ответа
Краткий ответ: он дает вам кодовую точку Unicode, которая начинается с указанного индекса в String
, то есть "номер юникода" символа в этой позиции.
Более длинный ответ: Java была создана, когда 16 бит (иначе char
) было достаточно для хранения любого существующего символа Юникода (эти части теперь известны как Базовая многоязычная плоскость или BMP). Позже Unicode был расширен, чтобы включить символы с кодовой точкой> 216. Это означает, что char
больше не может содержать все возможные кодовые точки Unicode.
Решением было UTF-16: он хранит "старые" кодовые точки Unicode в 16 битах (т.е. ровно один char
) и все новые 32-битные (т.е. два char
ценности). Эти два 16-битных значения называются "суррогатная пара". Сейчас строго говоря char
содержит "кодовую единицу UTF-16" вместо "символа Юникода", как это было раньше.
Теперь все "старые" методы (обработка только char
) можно использовать очень хорошо, если вы не используете ни одного из "новых" символов Юникода (или не очень заботитесь о них), но если вы заботитесь и о новых персонажах (или просто должны иметь полный Поддержка Unicode), тогда вам нужно будет использовать версии "codepoint", которые на самом деле поддерживают все возможные Unicode-коды.
Кодовые точки поддерживают символы выше 65535, то есть Character.MAX_VALUE.
Если у вас есть текст с такими высокими символами, вы должны работать с кодовыми точками или int
вместо char
s.
Это не происходит благодаря поддержке UTF-16, которая может использовать один или два 16-битных символа и превращать их в int
AFAIK, как правило, это требуется только для добавленных недавно добавленных многоязычных и дополнительных идеографических символов, таких как нетрадиционный китайский.
Пример кода ниже помогает прояснить использование
codePointAt
String myStr = "1💖3";
System.out.println(myStr.length()); // print 4, because 💖 is two char
System.out.println(myStr.codePointCount(0, myStr.length())); //print 3, factor in all unicode
int result = myStr.codePointAt(0);
System.out.println(Character.toChars(result)); // print 1
result = myStr.codePointAt(1);
System.out.println(Character.toChars(result)); // print 💖, because codePointAt will get surrogate pair (high and low)
result = myStr.codePointAt(2);
System.out.println(Character.toChars(result)); // print low surrogate of 💖 only, in this case it show "?"
result = myStr.codePointAt(3);
System.out.println(Character.toChars(result)); // print 3
Короче говоря редко, если вы используете кодировку по умолчанию в Java:) Но для более подробного объяснения попробуйте эти посты:
Сравнивая символ с кодовой точкой? 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
Надеюсь, что это поможет прояснить для вас вещи:)