首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BreakIterator在安卓系统中是如何工作的?

BreakIterator在安卓系统中是如何工作的?
EN

Stack Overflow用户
提问于 2017-02-14 14:25:35
回答 1查看 2.3K关注 0票数 8

我正在用Android (一个用于蒙古语的自定义垂直脚本TextView )制作我自己的文本处理器。我以为我必须自己找到所有的换行位置,这样才能实现换行,但后来我发现了BreakIterator。这似乎可以找到各种语言中字符、单词、行和句子之间的所有可能的断点。

我正在试着学习如何使用它。documentation比平均水平更有帮助,但仅仅从阅读上仍然很难理解。我还找到了一些教程(请参阅hereherehere),但它们缺少我想要的输出的完整解释。

我添加了这个问答风格的答案,以帮助自己学习如何使用BreakIterator

我将这个设为Java之外的一个Android标签,因为它们之间有apparently some difference。此外,安卓现在支持ICU BreakIterator,未来的答案可能会解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-14 14:39:46

BreakIterator可用于查找字符、单词、行和句子之间可能的分隔符。这对于在可见字符之间移动光标、双击以选择单词、三次单击以选择句子以及换行等操作非常有用。

样板代码

下面的示例中使用了以下代码。只需调整第一部分即可更改BreakIterator的文本和类型。

代码语言:javascript
复制
// 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中。我使用的是System.out.println而不是Log,所以它也可以在纯Java环境中进行测试。

我使用的是java.text.BreakIterator,而不是ICU one,后者只能从API24获得。有关详细信息,请参阅底部的链接。

人物

更改样板代码以包含以下内容

代码语言:javascript
复制
String text = "Hi 中文éé\uD83D\uDE00\uD83C\uDDEE\uD83C\uDDF3.";
BreakIterator breakIterator = BreakIterator.getCharacterInstance();

输出

代码语言:javascript
复制
0 H
1 i
2  
3 中
4 文
5 é
6 é
8 
10 
14 .

最有趣的部分在索引6810。您的浏览器可能会正确显示字符,也可能不会正确显示字符,但用户会将所有字符解释为单个字符,即使它们由多个UTF-16值组成。

单词

更改样板代码以包含以下内容:

代码语言:javascript
复制
String text = "I like to eat apples. 我喜欢吃苹果。";
BreakIterator boundary = BreakIterator.getWordInstance();

输出

代码语言:javascript
复制
0 I
1  
2 like
6  
7 to
9  
10 eat
13  
14 apples
20 .
21  
22 我
23 喜欢
25 吃
26 苹果
28 。

这里有一些有趣的事情需要注意。首先,在空格的两边检测到断字。第二,即使有不同的语言,多字汉字仍然被识别。这在我的测试中仍然是正确的,即使我将地区设置为Locale.US

线条

您可以保持代码与单词示例相同:

代码语言:javascript
复制
String text = "I like to eat apples. 我喜欢吃苹果。";
BreakIterator boundary = BreakIterator.getLineInstance();

输出

代码语言:javascript
复制
0 I 
2 like 
7 to 
10 eat 
14 apples. 
22 我
23 喜
24 欢
25 吃
26 苹
27 果。

请注意,分隔符位置不是整行文本。它们只是文本换行的方便位置。

输出类似于单词示例。但是,现在空格和标点符号包含在它之前的单词中。这是有意义的,因为您不希望新行以空格或标点符号开头。还要注意的是,中文字符对每个字符都有换行符。这与这样一个事实是一致的,即在中文中将多字符字词跨行断开是可以的。

句子

更改样板代码以包含以下内容:

代码语言:javascript
复制
String text = "I like to eat apples. My email is me@example.com.\n" +
        "This is a new paragraph. 我喜欢吃苹果。我不爱吃臭豆腐。";
BreakIterator boundary = BreakIterator.getSentenceInstance();

输出

代码语言:javascript
复制
0 I like to eat apples. 
22 My email is me@example.com.
50 This is a new paragraph. 
75 我喜欢吃苹果。
82 我不爱吃臭豆腐。

在多种语言中识别出正确的断句。此外,在电子邮件域中没有点的假阳性。

备注

您可以在创建BreakIterator时设置Locale,但如果不这样做,它将只使用default locale

进一步阅读

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42219292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档