Чем отличается codePointCount от substring().length()?
226
24 декабря 2017, 09:11
Привет всем. В 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
Или я что-то не так понял?
Answer 1
Разница проявится при появлении в строке символов, представимых более чем одним 16-битным блоком (code unit). Так как length возвращает количество 16-битных блоков, а codePointCount - именно символов.
Например, эмодзи состоят из пары 16-битных блоков, так как их код в таблице Unicode больше U+FFFF.
String s ="
Answer 2
Когда до людей дошло, что для кодирования всех мировых алфавитов одного байта не хватит, возникли многобайтовые кодировки и понятие code point.
Code point - это набор байт, описывающих ОДНУ графему(лигатуру) из одного из алфавитов(синтетические языки туда же), существующих на планете земля (смайлики, символы валют, математические символы и т.д. сюда же).
Диактрические знаки тоже являются code point кстати. (диактрический знак - это две точки над е в букве ё, например. Пример плохей - знаю, не докапывайтесь)
Собственно метод codePointCount возвращает колисество code point'ов, использованных в заданном куске тескта