Кодовые точки и кодовые единицы Java

Кодовые точки и кодовые единицы JavaВ языке Java строки реализованы как последовательности значений типа char. Тип char позволяет задавать кодовые единицы, представляющие кодовые точки Unicode в кодировке UTF-16. Наиболее часто используемые символы Unicode представляются одной кодовой единицей. Дополнительные символы задаются парами кодовых единиц.

Метод length() возвращает количество кодовых единиц для данной строки в кодировке UTF-16. Ниже приведен пример использования данного метода:

Чтобы определить реальную длину, представляющую собой число кодовых точек, надо использовать следующий вызов:

Метод s.charAt(n) возвращает кодовую единицу в позиции n, где n находится в интервале от 0 до s.length() — 1. Ниже приведены примеры вызова данного метода.

Для получения i-й кодовой точки надо использовать приведенные ниже выражения.

Java подсчитывает кодовые единицы в строках специфическим образом: первая кодовая единица в строке расположена в позиции 0. Это соглашение пришло из языка C, где по техническим причинами подсчет позиций начинается с 0. Эта причина давно ушла в прошлое, а неудобство осталось. Однако этому соглашению следует настолько много программистов, что проектировщики Java решили сохранить его.

Зачем мы подняли шум относительно кодовых единиц? Рассмотрим приведенную ниже строку:

Для представления символа Z используются две кодовые единицы UTF-16. Приведенный ниже вызов метода даст не код пробела, а второй код символа Z. Чтобы избежать возникновения данной проблемы, не следует применять тип char, так как он представляет символы на слишком низком уровне.

Если вы хотите просмотреть строку посимвольно, то есть получить по очереди каждую кодовую точку, вам надо использовать фрагмент кода, подобный показанному ниже.

К счастью, метод codePointAt() определяет, является ли кодовая единица первой или второй частью дополнительного символа, и всегда возвращает корректный результат. Поэтому вы можете организовать просмотр строки и в обратном направлении.