Wiem o tym String#codePointAt(int)
, ale jest indeksowany przez char
przesunięcie, a nie przez przesunięcie punktu kodowego.
Myślę o spróbowaniu czegoś takiego:
- używając
String#charAt(int)
do uzyskaniachar
at indeksu - testowanie, czy
char
jest 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
char
wartoś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
char
wartości, czy jedna - wydaje się to okropnie kosztownym sposobem na iterację postaci
- ktoś musiał wymyślić coś lepszego.
offset = s.offsetByCodePoints(offset, 1);
. Czy używanieoffset += Character.charCount(codepoint);
zamiast tego przynosi jakieś korzyści ?charAt()
co jest złym pomysłemDodano Java 8,
CharSequence#codePoints
która zwraca plikIntStream
zawierający punkty kodowe. Możesz użyć strumienia bezpośrednio, aby je iterować:lub z pętlą for, zbierając strumień do tablicy:
Te sposoby są prawdopodobnie droższe niż rozwiązanie Jonathana Feinbergsa , ale są szybsze do odczytu / zapisu, a różnica w wydajności będzie zwykle nieistotna.
źródło
for (int c : (Iterable<Integer>) () -> string.codePoints().iterator())
również działa.for (int c : (Iterable<Integer>) string.codePoints()::iterator) ...
Iteracja po punktach kodowych jest zgłaszana jako żądanie funkcji w firmie Sun.
Zobacz wpis błędów Sun
Jest tam również przykład jak iterować po String CodePoints.
źródło
Pomyślałem, że dodam metodę obejścia, która działa z pętlami foreach ( ref ), a ponadto możesz łatwo przekonwertować ją na nową metodę String # codePoints języka Java 8, gdy przejdziesz do java 8:
Możesz go używać z każdym w ten sposób:
Oto metoda pomocnicza:
Lub alternatywnie, jeśli chcesz po prostu przekonwertować ciąg na tablicę int (która może zużywać więcej pamięci RAM niż powyższe podejście):
Na szczęście używa "codePoints" bezpiecznie obsługuje zastępczą parę UTF-16 (wewnętrzna reprezentacja ciągu java).
źródło