System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
System.out.println();
System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
System.out.println(msg +
}
}
| Рис. 5.1. Вывод кириллической строки на консоль MS Windows 2000 |
В первые три строки консоли без преобразования в Unicode выводятся массивы байтов
byteCp1251, byteCp866 и byteKOI8R. Это выполняется методом write() класса FilterOutputStream из пакета java.io.
В следующие три строки консоли выведены строки Java, полученные из массива символов c[], массива byteCp866 и строки-константы.
Далее строки консоли содержат преобразованные массивы.
Вы видите, что на консоль правильно выводится только массив в кодировке CP866, записанный в строку с использованием кодовой таблицы CP1251. В чем дело? Здесь свой вклад в проблему русификации вносит вывод потока символов на консоль или в файл.
Как уже упоминалось в главе 1, в консольное окно Command Prompt операционных систем MS Windows текст выводится в кодировке CP866.
Для того чтобы учесть это, слова "\"Россия\" в" преобразованы в массив байтов, содержащий символы в кодировке CP866, а затем переведены в строку msg.
В предпоследней строке рис. 5.1 сделано перенаправление вывода программы в файл codes.txt. В MS Windows вывод текста в файл происходит в кодировке CP1251. На рис. 5.2 показано содержимое файла codes.txt в окне программы Notepad (Блокнот).
| Рис. 5.2. Вывод кириллической строки в файл |
Как видите, кириллица выглядит совсем по-другому. Правильные символы Unicode кириллицы получаются, если использовать ту же кодовую таблицу, в которой записан исходный массив байтов.
Вопросы русификации мы еще будем обсуждать в главах 9 и 24, а пока заметьте, что при создании строки из массива байтов лучше указывать ту же самую кириллическую кодировку, в которой записан массив. Тогда вы получите строку Java с правильными символами Unicode.
При выводе же строки на консоль, в окно, в файл или при передаче по сети лучше преобразовать строку Java с символами Unicode по правилам вывода в нужное место.
Еще один способ создать строку — это использовать два статических метода:
copyValueOf(char[] charArray);
copyValueOf(char[] charArray, int offset, int length);
Они формируют строку по заданному массиву символов и возвращают ее в качестве результата своей работы. Например, после выполнения следующего фрагмента программы
char[] c = {'C', ’и’, ’м’, ’в’, ’о’, ’л’, ’ь’, ’и1, ’ы’, ’й’};
String s1 = String.copyValueOf(c);
String s2 = String.copyValueOf(c, 3, 7);
получим в объекте s1 строку "Символьный", а в объекте s2-строку "вольный".
1. Потренируйтесь в преобразованиях строки в массивы байтов с разной кириллической кодировкой.
Со строками можно производить операцию сцепления строк (concatenation), обозначаемую знаком плюс (+). Эта операция создает новую строку, просто составленную из состыкованных первой и второй строк, как показано в начале данной главы. Ее можно применять и к константам, и к переменным. Например:
String attention = "Внимание: ";
String s = attention + "неизвестный символ";
Вторая операция — присваивание += — применяется к переменным в левой части: