В Java символьные строки реализованы в виде последовательности значений типа char. Как пояснялось ранее в разделе "Тип данных char", с помощью типа данных char можно задавать кодовые единицы, представляющие кодовые точки уникода в кодировке UTF-16. Наиболее часто употребляемые символы уникода представлены одной кодовой единицей, а дополнительные символы — парами кодовых единиц.
Метод length () возвращает количество кодовых единиц для данной строки в кодировке UTF-16. Ниже приведен пример применения данного метода.
String greeting = "Hello";
int n = greeting.length(); // значение n равно 5
Чтобы определить истинную длину, представляющую собой число кодовых точек, нужно сделать следующий вызов:
int cpCount = greeting.codePointCount (0, greeting.length());
При вызове метода s. char At (n) возвращается кодовая единица на позиции п, где п находится в пределах от 0 до s. length () - 1. Ниже приведены примеры вызова данного метода.
char first = greeting.charAt(0); // первый символ - 'Н' char last = greeting.charAt (4) ; // последний символ - 'о'
Для получения i-й кодовой точки служат приведенные ниже выражения.
int index = greeting.offsetByCodePoints(0, i) ; int cp = greeting.codePointAt(index);
НА ЗАМЕТКУ! В Java, как и в C/C++, кодовые единицы и кодовые точки в символьных строках подсчитываются с нулевой позиции.
А зачем вообще обсуждать кодовые единицы? Рассмотрим следующую символьную строку:
О is the set of octonions
Для представления символа О требуются две кодовые единицы в кодировке UTF-16. В результате приведенного ниже вызова будет получен не код пробела, а вторая кодовая единица символа О:
char ch = sentence.charAt(1)
Чтобы избежать подобных осложнений, не следует применять тип char, поскольку он представляет символы на слишком низком уровне.
Если же требуется просмотреть строку посимвольно, т.е. получить по очереди каждую кодовую точку, то для этой цели можно воспользоваться фрагментом кода, аналогичным приведенному ниже.
int cp = sentence.codePointAt(i);
if (Character.isSupplementaryCodePoint(cp)) i += 2; else i++;
А организовать просмотр строки и в обратном направлении можно следующим образом:
i—;
if (Character.isSurrogate(sentence.charAt(i))) i—; int cp = sentence.codePointAt(i);
|