2016-12-21 17 views
2

BreakIteratorを使用して、文字列内に表示される文字の数を数えます。これは英語に完全に対応しています。しかし、ヒンディー語の場合は、期待どおりに動作しません。AndroidのBreakIteratorが文字数を正しくカウントしない

以下の文字列の長さは3ですが、視覚的には1文字と見なされます。

ज्य

IはBreakIteratorを使用する場合、それは、単一のユニットとしてそれを考慮することが予想されるが、それは2つの単位として考えます。以下私のコードである:

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ループが開始= 0と終了= 3で一度実行されるべきです。しかし、上の文字列は2回実行されます(開始= 0、終了= 2、開始= 2、終了= 3)。

BreakIteratorをどうすれば正しく動作させることができますか?

UPDATE:

JAVAプログラムとして実行すると、コードの上の部分は完璧に動作します。それは、ANDROIDで使用されたときだけ誤動作します。 https://code.google.com/p/android/issues/detail?id=230832

答えて

0

私はあなたがUnicode文字

Oracle Doc. for Character Boundaries

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); 
    } 
+0

おかげSujitKumarでプレーする必要があると思う:これが唯一のAndroidで起こるので

は、私はアンドロイドのバグを報告しています。しかし、質問の私の更新を見てください。このコードはJavaで完全に機能します。それは私がAndroidでそれを使うときだけ誤動作する。 – Henry

関連する問題