## Límite de Caracter

Se necesitará localizar los límites de caracter si nuestra aplicación permite al usuario final seleccionar caracteres individuales. o mover el cursor a través del texto caracter a caracter. Para crear un BreakIterator que localice los límites de caracter se llama al método getCharacterInstance:

    BreakIterator characterIterator =
       BreakIterator.getCharacterInstance(currentLocale);

Este tipo de BreakIterator detecta límites entre caracteres de usuario, no sólo caracteres Unicode. Los caracteres de usuario varían con el idioma, pero la clase BreakIterator puede reconocer estas diferencias porque es sensible a la Localidad. Un caracter de usuario podría estar compuesto por uno o más caracteres Unicode. Por ejemplo, el caracter de usuario ü podría componerse combinando los caracteres Unicode '\u0075' (u) '\u00a8' (¨). Sin embargo, este no es el mejor ejemplo, porque el caracter ü también podría ser represetnado por un sólo caracter Unicode '\u00fc'. Veremos el idioma Árabe para un ejemplo más realista.

En Árabe, la palabra para casa es:

Aunque esta palabra contiene tres caracteres de usuario, está compuesta por seis caracteres Unicode:

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

Los caracteres Unicode de las posiciones 1,3 y 5 en la cadena house son diacríticos. En Árabe los diacríticos son necesarios, porque pueden alterar el significado de las palabras. Los diacríticos en nuesto ejemplo son caracteres no blancos ya que aparecen sobre los caracteres base. En un procesador de textos árabe, no podemos mover el cursor sobre cada caracter Unicode de la cadena. En su lugar, debemos movernos sobre cada caracter de usuario, que podría estar compuesto por más de un caracter Unicode. Por lo tanto, debemos utilizar un BreakIterator para scanear los caracteres de usuario en la cadena.

En nuestro ejemplo, BreakIteratorDemo.java, hemos creado un BreakIterator para scanear caracteres arábicos. Luego pasamos este BreakIterator, junto con el objeto String creado anteriormente, al método llamado listPositions:

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

    listPositions (house,arCharIterator);

El método listPositions utiliza un BreakIterator para localizar los límites de caracter dentro de la cadena. Observa que asignamos un string particular al BreakIterator con el método setText. Recuperamos el primer límite de caracter con el método first, luego llamamos al método next hasta que se devuelva la constante BreakIterator.DONE. Aquí podemos ver el código de esta rutina:

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

El método listPositions imprime las siguientes posiciones de límites para los caracteres de usuario de la cadena house. Las posiciones de los diacríticos (1, 3, 5) no se listan:

    0
    2
    4
    6

Ozito