обычные методы определения длины строки кажутся неудачными
Они не дают ошибок, длина строки отчета указывается как количество символов Юникода [*]. Если вам нужно другое поведение, вам нужно четко определить, что вы подразумеваете под «длиной строки».
Если вас интересуют длины строк для целей отображения, то обычно вы заинтересованы в подсчете пикселей (или некоторой другой логической / физической единицы), и это ответственность слоя дисплея (для начала у вас могут быть разные ширины для разные символы, если шрифт не моноширинный).
Но если вам просто интересно подсчитать количество графем ( "минимально различимая единица письма в контексте конкретной системы письма" ), вот хороший гид с кодом и примерами. Копируя-обрезая-вставляя соответствующий код оттуда, мы получили бы что-то вроде этого:
public static int getGraphemeCount(String text) {
int graphemeCount = 0;
BreakIterator graphemeCounter = BreakIterator.getCharacterInstance();
graphemeCounter.setText(text);
while (graphemeCounter.next() != BreakIterator.DONE)
graphemeCount++;
return graphemeCount;
}
Имейте в виду: вышеупомянутое использует значение по умолчанию locale
. Более гибкий и надежный метод будет, например, получать явный locale
в качестве аргумента и вызывать BreakIterator.getCharacterInstance(locale)
вместо
[*] Чтобы быть точным, как указано в комментариях, String.length()
насчитывает символов Java , которые фактически являются единицами кода в кодировке UTF-16. Это эквивалентно подсчету символов Юникода, только если мы находимся внутри BMP .