Character Boundaries

如果您的应用程序允许final用户突出显示单个字符或一次在文本中移动光标一次,则需要定位字符边界。要创建定位字符边界的BreakIterator,请按以下方式调用getCharacterInstance方法:

BreakIterator characterIterator =
    BreakIterator.getCharacterInstance(currentLocale);

这种类型的BreakIterator检测用户字符之间的边界,而不仅仅是 Unicode 字符。

一个用户字符可以由一个以上的 Unicode 字符组成。例如,用户字符ü可以通过组合 Unicode 字符\ u0075(u)和\ u00a8(¨)组成。但是,这不是最佳示例,因为字符ü也可以由单个 Unicode 字符\ u00fc 表示。我们将使用阿拉伯语作为一个更现实的示例。

阿拉伯语中的 house 一词是:

房子的阿拉伯象形 Literals

该词包含三个用户字符,但由以下六个 Unicode 字符组成:

String house = "\u0628" + "\u064e" + "\u064a" + "\u0652" + "\u067a" + "\u064f";

house字符串 中位置 1、3 和 5 的 Unicode 字符是变音符号。阿拉伯语需要变音符号,因为它们可以改变单词的含义。该示例中的变音符号是非空格字符,因为它们出现在基本字符上方。在阿拉伯语 Literals 处理器中,您不能为字符串 中的每个 Unicode 字符在屏幕上移动一次光标。相反,您必须为每个用户字符移动一次,该字符可能由多个 Unicode 字符组成。因此,您必须使用BreakIterator来扫描字符串 中的用户字符。

示例程序BreakIteratorDemo创建一个BreakIterator来扫描阿拉伯字符。程序将此BreakIterator以及先前创建的String对象传递给名为listPositions的方法:

BreakIterator arCharIterator = BreakIterator.getCharacterInstance(
                                   new Locale ("ar","SA"));
listPositions (house, arCharIterator);

listPositions方法使用BreakIterator定位字符串 中的字符边界。请注意,BreakIteratorDemo使用setText方法将特定的字符串 分配给BreakIterator。程序使用first方法检索第一个字符边界,然后调用next方法,直到返回常数BreakIterator.DONE。该例程的代码如下:

static void listPositions(String target, BreakIterator iterator) {
                
    iterator.setText(target);
    int boundary = iterator.first();

    while (boundary != BreakIterator.DONE) {
        System.out.println (boundary);
        boundary = iterator.next();
    }
}

listPositions方法为字符串house中的用户字符打印以下边界位置。请注意,未列出变音符号的位置(1、3、5):

0
2
4
6