Что именно делает 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 вместо chars.

Это не происходит благодаря поддержке 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

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

Другие вопросы по тегам