2017-02-14 4 views
2

Ich mache meinen eigenen Textprozessor in Android (ein benutzerdefiniertes vertikales Skript TextView für Mongolisch). Ich dachte, ich müsste alle Zeilen brechenden Stellen selbst finden, so dass ich Zeilenumbruch implementieren könnte, aber dann entdeckte ich BreakIterator. Dies scheint alle möglichen Unterbrechungen zwischen Zeichen, Wörtern, Zeilen und Sätzen in verschiedenen Sprachen zu finden.Wie funktioniert BreakIterator in Android?

Ich versuche zu lernen, wie man es benutzt. Die documentation war hilfreicher als der Durchschnitt, aber es war immer noch schwer zu verstehen, nur durch Lesen. Ich fand auch ein paar Tutorials (siehe here, here und), aber sie fehlten die vollständige Erklärung mit der Ausgabe, die ich suchte.

Ich füge dieses Q & ein Stil Antwort, um mir zu helfen, zu lernen, wie man BreakIterator verwendet.

Ich mache dies ein Android-Tag zusätzlich zu Java, weil es apparently some difference zwischen ihnen gibt. Außerdem unterstützt Android jetzt die ICU BreakIterator und zukünftige Antworten können damit umgehen.

Antwort

4

BreakIterator kann verwendet werden, um die möglichen Brüche zwischen Zeichen, Wörtern, Zeilen und Sätzen zu finden. Dies ist nützlich, wenn Sie den Cursor durch sichtbare Zeichen bewegen, mit einem Doppelklick Wörter auswählen, mit einem Dreifachklick Elemente auswählen und Zeilenumbrüche ausführen.

Standardcode

Der folgende Code wird in den nachfolgenden Beispielen verwendet. Passen Sie einfach den ersten Teil an, um den Text und den Typ von BreakIterator zu ändern.

// 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; 
} 

wenn Sie ihn nur aus testen möchten, können Sie es direkt in eine Aktivität des onCreate in Android einfügen. Ich verwende System.out.println anstelle von Log, so dass es auch in einer Java-Umgebung getestet werden kann.

Ich verwende die java.text.BreakIterator anstelle der ICU, die nur von API 24 verfügbar ist. Weitere Informationen finden Sie unter den Links unten.

Charaktere

Ändern Sie den Standardcode die folgende

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

Ausgabe

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

Die meisten Interesse Teile sind bei Indizes 6, 8 und 10 aufzunehmen. Ihr Browser zeigt die Zeichen möglicherweise korrekt an oder nicht, aber ein Benutzer würde alle diese Zeichen als einzelne Zeichen interpretieren, obwohl sie aus mehreren UTF-16-Werten bestehen.

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

Ausgabe

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

Es gibt ein paar interessante Dinge zu beachten hier:

Wörter

Ändern Sie den Standardcode Folgendes umfassen.Zuerst wird ein Wortbruch auf beiden Seiten eines Raumes erkannt. Zweitens, obwohl es verschiedene Sprachen gibt, wurden mehrstellige chinesische Wörter immer noch erkannt. Das war in meinen Tests auch dann noch richtig, wenn ich das Gebietsschema auf Locale.US setzte.

Linien

Sie den Code das gleiche wie für die Wörter Beispiel halten können:

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

Ausgabe

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

Beachten Sie, dass die Bruchstellen Text nicht ganze Zeilen sind. Sie sind nur geeignete Orte, um Text zu umbrechen.

Die Ausgabe ähnelt dem Beispiel für Wörter. Jetzt sind jedoch Leerzeichen und Interpunktion mit dem Wort davor enthalten. Dies ist sinnvoll, weil Sie nicht möchten, dass eine neue Zeile mit Leerzeichen oder Satzzeichen beginnt. Beachten Sie auch, dass chinesische Zeichen für jedes Zeichen Zeilenumbrüche erhalten. Dies steht im Einklang mit der Tatsache, dass es in Ordnung ist, Wörter mit mehreren Zeichen in chinesischen Schriftzeichen zu trennen.

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

Ausgabe

image to represent text output

korrekte Satz Pausen erkannt wurden in mehreren Sprachen:

Sätze

Ändern Sie den Standardcode Folgendes umfassen. Es gab auch keinen falschen positiven Punkt für den Punkt in der E-Mail-Domäne.

Hinweise

Sie die Locale festlegen können, wenn Sie eine BreakIterator erstellen, aber wenn man es nutzt nicht nur die default locale.

Literatur

+0

Das Brechen des chinesischen Textes in Wörter funktioniert nicht richtig für mich. Können Sie sich https://stackoverflow.com/questions/44507838/breakiterator-not-working-correctly-with-chinese-text ansehen? – srgsanky

Verwandte Themen