## Bytes Codificados y Strings

Si el texto no-Unicode está almacenado en un array de bytes, se pueden convertir a Unicode con uno de los métodos constructores de String. Inversamente, se puede convertir un objeto String en un array de bytes de caracters no-Unicode con el método String.getBytes. Cuando se llama a estos métodos se debe especificar el identificador de la codificacióm como uno de los parámetros.

En los siguientes ejemplos convertiremos caracteres entre UTF8 y Unicode. UTF8 es una forma binaria compacta para codificar caracteres Unicode de 16-bits en 8 bits. El código fuente de este ejemplo está en el fichero llamado StringConverter.java.

Primero creamos un String que contiene los caracteres Unicode:

    String original = new String("A" + "\u00ea" + "\u00f1"
                                     + "\u00fc" + "C");

Cuando imprimimos el String llamado original aparecerá como:

    AêñüC

Para convertir el objeto String a UTF8, llamamos al método getBytes y le especificamos el identificador de codificación apropiado como un parámetro. El método getBytes devuelve un array de bytes en formato UTF8. Para crear un objeto String desde un array de bytes no-Unicode, llamamos al constructor de String con el parámetro de la codificación, El código que hace estás llamadas está encerrado en un bloque try, para el caso de que la codificación especificada no estuviera soportada:

    try {
       byte[] utf8Bytes = original.getBytes("UTF8");
       byte[] defaultBytes = original.getBytes();

       String roundTrip = new String(utf8Bytes, "UTF8");
       System.out.println("roundTrip = " + roundTrip);

       System.out.println();
       printBytes(utf8Bytes, "utf8Bytes");
       System.out.println();
       printBytes(defaultBytes, "defaultBytes");
       }
    catch (UnsupportedEncodingException e) {
       e.printStackTrace();
    }

Imprimimos los valores de los arrays utf8Bytes y defaultBytes para demostrar un punto importante. La longitud del texto convertido podría no ser la misma que la longitud del texto original. Algunos caracteres Unicode se traducen en bytes sencillos, y otros en parejas de bytes. Nuestra rutina para mostrar los arrays de bytes es esta:

    public static void printBytes(byte[] array, String name) {
       for (int k = 0; k < array.length; k++) {
          System.out.println(name + "[" + k + "] = " + "0x" +
             UnicodeFormatter.byteToHex(array[k]));

       }
    }

Aquí está la salida de los métodos printBytes. Observa que sólo el primer y último caracteres la "A" y la "C", son los mismos en los dos arrays:

    utf8Bytes[0] = 0x41
    utf8Bytes[1] = 0xc3
    utf8Bytes[2] = 0xaa
    utf8Bytes[3] = 0xc3
    utf8Bytes[4] = 0xb1
    utf8Bytes[5] = 0xc3
    utf8Bytes[6] = 0xbc
    utf8Bytes[7] = 0x43

    defaultBytes[0] = 0x41
    defaultBytes[1] = 0xea
    defaultBytes[2] = 0xf1
    defaultBytes[3] = 0xfc
    defaultBytes[4] = 0x43

Ozito