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
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
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