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. В чем дело? Здесь свой вклад в проблему русификации вносит вывод потока символов на консоль или в файл.
Как уже упоминалось в
Для того чтобы учесть это, слова "\"Россия\" в" преобразованы в массив байтов, содержащий символы в кодировке CP866, а затем переведены в строку msg.
В предпоследней строке рис. 5.1 сделано перенаправление вывода программы в файл codes.txt. В MS Windows вывод текста в файл происходит в кодировке CP1251. На рис. 5.2 показано содержимое файла codes.txt в окне программы Notepad (Блокнот).
Рис. 5.2. Вывод кириллической строки в файл |
Как видите, кириллица выглядит совсем по-другому. Правильные символы 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. Потренируйтесь в преобразованиях строки в массивы байтов с разной кириллической кодировкой.
Со строками можно производить операцию
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.
Внимательный читатель, изучивший рис. 4.7, готов со мной не согласиться. Ну что же, действительно, символы хранятся в массиве, но он закрыт, как и все поля класса String.
Логический метод isEmpty(), появившийся в Java SE 6, возвращает true, если строка пуста, в ней нет ни одного символа.
Выбрать символ с индексом ind (индекс первого символа равен нулю) можно методом charAt(int ind). Если индекс ind отрицателен или не меньше, чем длина строки, возникает исключительная ситуация. Например, после определения
char ch = s.charAt(3);
переменная ch будет иметь значение 't' .