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;
}
如果您只是想测试一下,可以将其直接粘贴到 Activity 的onCreate
在安卓中。我在用着System.out.println
而不是Log
因此它也可以在纯 Java 环境中进行测试。
我正在使用java.text.BreakIterator
而不是 ICU ,后者只能从 API 24 获得。有关更多信息,请参阅底部的链接。
人物
更改样板代码以包含以下内容
String text = "Hi 中文éé\uD83D\uDE00\uD83C\uDDEE\uD83C\uDDF3.";
BreakIterator breakIterator = BreakIterator.getCharacterInstance();
Output
0 H
1 i
2
3 中
4 文
5 é
6 é
8 ????
10 ????????
14 .
最有趣的部分是索引6
, 8
, and 10
。您的浏览器可能会或可能不会正确显示这些字符,但用户会将所有这些字符解释为单个字符,即使它们由多个 UTF-16 值组成。
Words
更改样板代码以包含以下内容:
String text = "I like to eat apples. 我喜欢吃苹果。";
BreakIterator boundary = BreakIterator.getWordInstance();
Output
0 I
1
2 like
6
7 to
9
10 eat
13
14 apples
20 .
21
22 我
23 喜欢
25 吃
26 苹果
28 。
这里有一些有趣的事情需要注意。首先,在空格的两侧检测到断词。其次,尽管存在不同的语言,但多字汉字仍然被识别。即使我将语言环境设置为,在我的测试中仍然如此Locale.US
.
Lines
您可以保持与 Words 示例相同的代码:
String text = "I like to eat apples. 我喜欢吃苹果。";
BreakIterator boundary = BreakIterator.getLineInstance();
Output
0 I
2 like
7 to
10 eat
14 apples.
22 我
23 喜
24 欢
25 吃
26 苹
27 果。
请注意,中断位置不是整行文本。它们只是换行文本的方便位置。
输出与 Words 示例类似。但是,现在前面的单词包含空格和标点符号。这是有道理的,因为您不希望新行以空格或标点符号开头。另请注意,中文字符的每个字符都有换行符。这与中文多字词跨行断行是可以的一致的。
句子
更改样板代码以包含以下内容:
String text = "I like to eat apples. My email is [email protected] /cdn-cgi/l/email-protection.\n" +
"This is a new paragraph. 我喜欢吃苹果。我不爱吃臭豆腐。";
BreakIterator boundary = BreakIterator.getSentenceInstance();
Output
0 I like to eat apples.
22 My email is [email protected] /cdn-cgi/l/email-protection.
50 This is a new paragraph.
75 我喜欢吃苹果。
82 我不爱吃臭豆腐。
多种语言都可以识别正确的断句。此外,电子邮件域中的点没有出现误报。
Notes
您可以设置Locale https://developer.android.com/reference/java/util/Locale.html当你创建一个BreakIterator
,但如果你不这样做,它只会使用默认语言环境 https://developer.android.com/reference/java/util/Locale.html#getDefault().
进一步阅读
- 文档 https://developer.android.com/reference/java/text/BreakIterator.html
- BreakIterator 的 ICU 版本 https://developer.android.com/reference/android/icu/text/BreakIterator.html
-
This http://tutorials.jenkov.com/java-internationalization/breakiterator.html是更有用的教程之一。