Tak więc wiem o String#codePointAt(int)
, ale jest on indeksowany przez przesunięcie char
, a nie przez offset kodu współrzędnych.Jak mogę iterować przez punkty kodowe Unicode ciągu Java?
myślę o próbuje coś takiego:
- użyciu
String#charAt(int)
uzyskaćchar
w indeksie - testowania czy
char
jest w high-surrogates range- jeśli tak, aby wykorzystać
String#codePointAt(int)
uzyskaj punkt kodowy i zwiększ wartość indeksu o 2 - , jeśli nie, użyj podanego
char
wartość jako punkt kodowy, a przyrost wskaźnika o 1
- jeśli tak, aby wykorzystać
Ale moje obawy są
- Nie jestem pewien, czy codepoints które są naturalnie w wysokich surogatów zasięg będą przechowywane jako dwie wartości lub jedna
- wydaje się to bardzo kosztownym sposobem na przerabianie znaków. Ktoś musiał wymyślić coś lepszego.
Co do tego, czy jest "droga", czy ... nie ma innej możliwości wbudowania w Javę. Ale jeśli masz do czynienia tylko ze skryptami Latin/European/Cyrillic/Greek/Hebrew/Arabic, to po prostu s.charAt() do treści twojego serca. :) –
Ale nie powinieneś. Na przykład, jeśli twój program wyprowadza XML i jeśli ktoś poda mu jakiś niejasny operator matematyczny, to nagle twój XML może być nieważny. –
@ Jonathan Feinberg Tak myślałem. Ale przyszedł ten specjalny matematyczny E. UTF-16 działa 99% czasu - ale wtedy robi się naprawdę bolesny. Zwłaszcza, gdy problemy pozostają ukryte przez długi czas. – Martin