Wiem o tym String#codePointAt(int), ale jest indeksowany przez charprzesunięcie, a nie przez przesunięcie punktu kodowego.
Myślę o spróbowaniu czegoś takiego:
- używając
String#charAt(int)do uzyskaniacharat indeksu - testowanie, czy
charjest w zakresie wysokich surogatów- jeśli tak, użyj,
String#codePointAt(int)aby uzyskać kod i zwiększ indeks o 2 - jeśli nie, użyj podanej
charwartości jako punktu kodowego i zwiększ indeks o 1
- jeśli tak, użyj,
Ale moje obawy są
- Nie jestem pewien, czy punkty kodowe, które naturalnie znajdują się w zakresie z wysokim surogatem, będą przechowywane jako dwie
charwartości, czy jedna - wydaje się to okropnie kosztownym sposobem na iterację postaci
- ktoś musiał wymyślić coś lepszego.