Программа StringConverter запускается с создания строки, содержащей
Юникод символы:
String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
При печати оригинал с именованной строкой выглядит как:
AêñüC
Чтобы преобразовать объект String в UTF-8, вызовите метод getBytes и
укажите соответствующий идентификатор кодировки в качестве параметра.
Метод getBytes возвращает массив байтов в формате UTF-8. Чтобы создать
Объект String из массива байтов, отличных от Unicode, вызывает строку
конструктор с параметром кодирования. Код, который делает эти
звонки заключены в блок try, если указанная кодировка
неподдерживаемый:
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();
}
Программа StringConverter выводит значения в utf8Bytes и
массивы defaultBytes для демонстрации важного момента: длина
преобразованный текст может не совпадать с длиной источника
текст. Некоторые символы Unicode переводятся в отдельные байты, другие - в
пары или тройки байтов.
Метод printBytes отображает байтовые массивы, вызывая метод byteToHex, который определен в исходном файле,
UnicodeFormatter.java. Вот метод printBytes:
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]));
}
}
Вывод метода printBytes следующий. Обратите внимание, что только первый
и последние байты, символы A и C, одинаковы в обоих массивах:
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