Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Чем отличается codePointCount от substring().length()?

#java


Привет всем. В Java у строки есть метод codePointCount. Его можно записать так?

String s = "Hello, string!";
System.out.println(String.valueOf(s.codePointCount(0, 5));
System.out.println(String.valueOf(s.substring(0, 5).length());


Зачем вообще считать количество символов если можно просто отнять от второго аргумента
первый 

5 - 0 = 5


Или я что-то не так понял?
    


Ответы

Ответ 1



Разница проявится при появлении в строке символов, представимых более чем одним 16-битным блоком (code unit). Так как length возвращает количество 16-битных блоков, а codePointCount - именно символов. Например, эмодзи состоят из пары 16-битных блоков, так как их код в таблице Unicode больше U+FFFF. String s = "😀"; System.out.println(s.length() + " " + s.codePointCount(0, 2)); // 2 1 Соответственно, длина строки s будет 2, но символ в ней только один.

Ответ 2



Когда до людей дошло, что для кодирования всех мировых алфавитов одного байта не хватит, возникли многобайтовые кодировки и понятие code point. Code point - это набор байт, описывающих ОДНУ графему(лигатуру) из одного из алфавитов(синтетические языки туда же), существующих на планете земля (смайлики, символы валют, математические символы и т.д. сюда же). Диактрические знаки тоже являются code point кстати. (диактрический знак - это две точки над е в букве ё, например. Пример плохей - знаю, не докапывайтесь) Собственно метод codePointCount возвращает колисество code point'ов, использованных в заданном куске тескта

Комментариев нет:

Отправить комментарий