有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BreakIterator在Android中是如何工作的?

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

我正在努力学习如何使用它。这个documentation比平均水平更有用,但仅仅通过阅读还是很难理解。我还找到了一些教程(参见herehere、和here),但它们缺乏我所寻找的完整的输出解释

我加入这项质询;一个帮助自己学习如何使用BreakIterator的风格答案

除了Java之外,我还将此作为Android标记,因为它们之间有apparently some difference。另外,Android现在支持ICU ^{},未来的答案可能会解决这个问题


共 (1) 个答案

  1. # 1 楼答案

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

    如果您只是想测试一下,可以在Android中将其直接粘贴到活动的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();
    

    输出

    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

    线条

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

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

    请注意,打断位置不是整行文字。它们只是换行文本的方便地方

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

    判决

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

    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时设置Locale,但如果不设置,则只使用default locale

    进一步阅读