2017-02-14 11 views
2

私は、Androidでの私自身のテキストプロセッサ(モンゴルのカスタム縦スクリプトのTextViewを)作ってるんです。私は、行の折り返しを実装できるように、すべての行を自分で見つけなければならないと思ったが、BreakIteratorを発見した。これは、さまざまな言語の文字、単語、行、文章の間に起こりうるすべての壊れ目を見つけているようです。BreakIteratorはどのようにAndroidで動作しますか?

私はそれを使用する方法を学ぶためにしようとしています。 documentationは平均よりも役に立ちましたが、読んだだけではまだ分かりませんでした。私はまた、(herehere、およびhereを参照してください)いくつかのチュートリアルを見つけましたが、彼らは私が探していた出力を備えた完全な説明を欠いていました。

私はこのQを追加しています& BreakIteratorの使い方を学ぶのに役立つスタイルの答えです。

それらの間のapparently some differenceがあるので、私は、Javaに加えて、Androidのタグにこれを作ってるんです。また、AndroidはICU BreakIteratorをサポートしており、今後の対応でこれを処理することができます。

答えて

4

BreakIteratorは、文字、単語、行、および文章の間の可能な休憩を見つけるために使用することができます。これは、カーソルを表示可能な文字に移動する、ダブルクリックして単語を選択する、トリプルクリックしてセンテンスを選択する、行折り返しなどの場合に便利です。

ボイラープレートコード

次のコードは、以下の例で使用しています。最初の部分を調整してテキストを変更し、BreakIteratorと入力してください。

// change these two lines for the following examples 
String text = "This is some text."; 
BreakIterator boundary = BreakIterator.getCharacterInstance(); 

// boiler plate code 
boundary.setText(text); 
int start = boundary.first(); 
for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) { 
    System.out.println(start + " " + text.substring(start, end)); 
    start = end; 
} 

あなたはこのをテストしたい場合は、活動のonCreate Androidの中に直接貼り付けることができます。私はLogではなくSystem.out.printlnを使用しているため、Javaのみの環境でもテスト可能です。

私はICUのものではなく、java.text.BreakIteratorを使用しています。これはAPI 24からのみ利用できます。詳細については、下のリンクをご覧ください。

文字

変更定型コードが含まれるように、次の

String text = "English中文123éé\uD83D\uDE00\uD83C\uDDEE\uD83C\uDDF3."; 
BreakIterator breakIterator = BreakIterator.getCharacterInstance(); 

出力

0 H 
1 i 
2 
3 中 
4 文 
5 é 
6 é 
8 
10 
14 . 

最も関心の部分はインデックス68であり、そして10。ブラウザでは文字が正しく表示される場合と表示されない場合がありますが、複数のUTF-16値で構成されていても、これらの文字はすべて1文字と解釈されます。以下を含むように

言葉

変更定型コード:

String text = "I like to eat apples. 我喜欢吃苹果。"; 
BreakIterator boundary = BreakIterator.getWordInstance(); 

出力

0 I 
1 
2 like 
6 
7 to 
9 
10 eat 
13 
14 apples 
20 . 
21 
22 我 
23 喜欢 
25 吃 
26 苹果 
28 。 

ここで注意すべきいくつかの興味深いものがあります。まず、スペースの両側で単語区切りが検出されます。第二に、異なる言語があるにもかかわらず、複数文字の中国語が依然として認識されていました。私がロケールをLocale.USに設定したとしても、これは私のテストではまだ真実でした。

あなたは言葉の例と同じコードを維持することができます

0 I 
2 like 
7 to 
10 eat 
14 apples. 
22 我 
23 喜 
24 欢 
25 吃 
26 苹 
27 果。 

String text = "I like to eat apples. 我喜欢吃苹果。"; 
BreakIterator boundary = BreakIterator.getLineInstance(); 

出力ブレークの位置は、テキストの行全体ではないこと。それらはテキストを折り返すだけの便利な場所です。

出力は単語の例に似ています。しかし、空白と句読点はその前の単語に含まれています。新しい行を空白や句読点で始めることを望まないため、これは意味があります。また、中国語の文字はすべての文字に改行が付くことに注意してください。これは、中国語の複数行にわたる複数の単語を壊すことは問題ではないという事実と一致しています。

変更以下を含むように定型的なコードは:

String text = "I like to eat apples. My email is [email protected]\n" + 
     "This is a new paragraph. 我喜欢吃苹果。我不爱吃臭豆腐。"; 
BreakIterator boundary = BreakIterator.getSentenceInstance(); 

出力

image to represent text output

正しい文分割は、複数の言語で認識されました。また、電子メールドメイン内のドットについて偽陽性はなかった。

ノート

あなたがBreakIteratorを作成するときには、Localeを設定することができますが、そうでない場合はそれだけでdefault localeを使用しています。さらに

+0

中国語のテキストを単語に分割することが正しく機能していません。 https://stackoverflow.com/questions/44507838/breakiterator-not-working-correctly-with-chinese-textでご覧いただけますか? – srgsanky

関連する問題