Ильдар Хабибуллин - Java 7 [Наиболее полное руководство]
- Название:Java 7 [Наиболее полное руководство]
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2012
- ISBN:978-5-9775-0735-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Ильдар Хабибуллин - Java 7 [Наиболее полное руководство] краткое содержание
Java 7 [Наиболее полное руководство] - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
(byte)0xD0, (byte)0xEE, (byte)0xF1, (byte)0xF1, (byte)0xE8, (byte)0xFF
};
byte[] byteCp866 = {
(byte)0x90, (byte)0xAE, (byte)0xE1, (byte)0xE1, (byte)0xA8, (byte)0xEF
};
byte[] byteKOI8R = {
(byte)0xF2, (byte)0xCF, (byte)0xD3, (byte)0xD3, (byte)0xC9, (byte)0xD1
};
char[] c = {'Р', 'о', 'с', 'с', 'и', 'я'};
String s1 = new String(c);
String s2 = new String(byteCp866); // Для консоли MS Windows
String s3 = "Россия";
System.out.println(); try{
// Сообщение в Cp866 для вывода на консоль MS Windows | |||||
---|---|---|---|---|---|
msg = new String("\ | "Россия\" в ".getBytes("Cp866") , | "Cp1251"); | |||
winLikeWin | = new | String(byteCp1251, | "Cp1251"); | // | Правильно |
winLikeDOS | = new | String(byteCp1251, | "Cp866"); | ||
winLikeUNIX | = new | String(byteCp1251, | "KOI8-R"); | ||
dosLikeWin | = new | String(byteCp866, | "Cp1251"); | // | Для консоли |
dosLikeDOS | = new | String(byteCp866, | "Cp866"); | // | Правильно |
dosLikeUNIX | = new | String(byteCp866, | "KOI8-R") ; | ||
unixLikeWin | = new | String(byteKOI8R, | "Cp1251"); | ||
unixLikeDOS | = new | String(byteKOI8R, | "Cp866"); | ||
unixLikeUNIX | = new | String(byteKOI8R, | "KOI8-R") ; | // | Правильно |
System.out.print(msg + "Cp1251: ");
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 +
}
}
![]() |
Рис. 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 + "неизвестный символ";
Вторая операция — присваивание += — применяется к переменным в левой части:
attention += s;
Поскольку операция + перегружена со сложения чисел на сцепление строк, встает вопрос о приоритете этих операций. У сцепления строк приоритет выше, чем у сложения, поэтому записав "2" + 2 + 2, получим строку "222". Но записав 2 + 2 + "2", получим строку "42", поскольку действия выполняются слева направо. Если же запишем "2" + (2 + 2), то получим "24".
Кроме операции сцепления соединить строки можно методом concat (), например:
String s = attention.concat("иеизвестиый символ");
Для того чтобы узнать длину строки, т. е. количество символов в ней, надо обратиться к методу length ( ):
String s = "Write once, run anywhere."; int len = s.length();
или еще проще
int len = "Write once, run anywhere.".length();
поскольку строка-константа — полноценный объект класса String.
Заметьте, что строка — это не массив, у нее нет поля length.
Читать дальшеИнтервал:
Закладка: