BreakIterator如何在Android中工作?

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

我正在尝试学习如何使用它。该文档比一般文档更有帮助,但仅通过阅读仍然难以理解。我还找到了一些教程(请参见此处,此处和此处),但是它们缺少我想要的输出的完整说明。

我添加了此问答形式的答案,以帮助自己学习使用方法BreakIterator

我将其设置为Java之外的Android标签,因为它们之间显然存在一些差异。此外,Android现在支持ICUBreakIterator,将来的答案可能会解决此问题。

回答:

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;

}

如果您只是想测试一下,可以将其直接粘贴到onCreateAndroid 的“活动”

中。我使用的System.out.println不是,Log因此它也可以在纯Java环境中进行测试。

我使用的java.text.BreakIterator是ICU,而不是ICU,仅可通过API 24获得。有关更多信息,请参见底部的链接。

性格

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

String text = "Hi 中文éé\uD83D\uDE00\uD83C\uDDEE\uD83C\uDDF3.";

BreakIterator breakIterator = BreakIterator.getCharacterInstance();

输出量

0 H

1 i

2

3 中

4 文

5 é

6 é

8 ????

10 ????????

14 .

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

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

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

线数

您可以使代码与Words示例相同:

String text = "I like to eat apples. 我喜欢吃苹果。";

BreakIterator boundary = BreakIterator.getLineInstance();

输出量

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 me@example.com.\n" +

"This is a new paragraph. 我喜欢吃苹果。我不爱吃臭豆腐。";

BreakIterator boundary = BreakIterator.getSentenceInstance();

输出量

0 I like to eat apples. 

22 My email is me@example.com.

50 This is a new paragraph.

75 我喜欢吃苹果。

82 我不爱吃臭豆腐。

正确的断句用多种语言识别。此外,电子邮件域中的点也没有误报。

笔记

您可以在创建时设置语言环境BreakIterator,但如果不设置,则仅使用默认语言环境。

进一步阅读

  • 文献资料
  • ICU版本的BreakIterator
  • 这是更有用的教程之一。

以上是 BreakIterator如何在Android中工作? 的全部内容, 来源链接: utcz.com/qa/400663.html

回到顶部