BreakIterator в Android неправильно считает символы

Я использую BreakIterator для подсчета количества видимых символов в строке. Это отлично работает для английского языка. Но в случае языка хинди это не работает должным образом.

Приведенная ниже строка имеет длину 3, но визуально считается одним символом.

ज्य

Когда я использовал BreakIterator, я ожидаю, что он будет рассматривать его как одну единицу, но он считает ее двумя единицами. Ниже приведен мой код:

    final String text = "ज्य";
    final Locale locale = new Locale("hi","IN");
    final BreakIterator breaker = BreakIterator.getCharacterInstance(locale);
    breaker.setText(text);
    int start = breaker.first();
    for (int end = breaker.next();
         end != BreakIterator.DONE;
         start = end, end = breaker.next()) {

        final String substring = text.substring(start, end);
    }

В идеале цикл for должен выполняться ОДИН РАЗ с start=0 и end=3; Но для приведенной выше строки он выполняется дважды (начало = 0, конец = 2 и начало = 2, конец = 3).

Как я могу заставить BreakIterator работать точно?

ОБНОВЛЕНИЕ:

Приведенный выше фрагмент кода отлично работает при запуске в качестве программы JAVA. Он плохо себя ведет только при использовании в ANDROID.

Поскольку это происходит только в Android, я сообщил об ошибке в Android: https://code.google.com/p/android/issues/detail?id=230832


person Henry    schedule 21.12.2016    source источник
comment
Прошел год, а Google до сих пор не нашел времени исправить это. Грустный ребенок всегда плачет :(   -  person Unknown    schedule 29.11.2019
comment
Вы решили эту проблему? Я также застрял с этим поведением Android.   -  person Prashanth    schedule 01.03.2021


Ответы (1)


Я думаю, вам нужно играть с символами юникода

Документ Oracle. для границ символов

    final String text = "\u091C\u094D\u092F";
    final Locale locale = new Locale("hi","IN");
    final BreakIterator breaker = BreakIterator.getCharacterInstance(locale);
    breaker.setText(text);
    int start = breaker.first();
    for (int end = breaker.next();
         end != BreakIterator.DONE;
         start = end, end = breaker.next()) {

        final String substring = text.substring(start, end);
        System.out.println(substring);
    }
person SujitKumar    schedule 22.12.2016
comment
Спасибо, Суджит Кумар. Но посмотрите на мое обновление в вопросе. Кусок кода отлично работает на Java. Он плохо себя ведет только тогда, когда я использую его в Android. - person Henry; 22.12.2016