System.out.write(byteCp1251);
System.out.println();
System.out.print(msg + "Cp866 : ");
System.out.write(byteCp866);
System.out.println();
System.out.print(msg + "KOI8-R: ") ;
System.out.write(byteKOI8R);
}catch(Exception e){ e.printStackTrace();
}
System.out.println();
System.out.println();
"char array : |
II |
+ |
s1); |
"default encoding: |
II |
+ |
s2); |
"string constant : |
II |
+ |
s3); |
"Cp1251 -> |
Cp1251 |
II |
+ |
winLikeWin); |
"Cp1251 -> |
Cp866 : |
II |
+ |
winLikeDOS); |
"Cp1251 -> |
KOI8-R |
II |
+ |
winLikeUNIX); |
"Cp866 -> |
Cp1251 |
II |
+ |
dosLikeWin); |
"Cp866 -> |
Cp866 : |
II |
+ |
dosLikeDOS); |
"Cp866 -> |
KOI8-R |
II |
+ |
dosLikeUNIX); |
"KOI8-R -> |
Cp1251 |
II |
+ |
unixLikeWin); |
"KOI8-R -> |
Cp866 : |
II |
+ |
unixLikeDOS); |
"KOI8-R -> |
KOI8-R |
II |
+ |
unixLikeUNIX) |
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 +
}
}
Все эти данные выводятся на консоль MS Windows 2000, как показано на рис. 5.1.
 |
Рис. 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), обозначаемую знаком плюс (+). Эта операция создает новую строку, просто составленную из состыкованных первой и второй строк, как показано в начале данной главы. Ее можно применять и к константам, и к переменным. Например:
Читать дальше
Конец ознакомительного отрывка
Купить книгу