компілятор виконає приблизно так:
String s = new StringBuffer (). Append ( "Це"). Append ( "одна")
Буде створено об'єкт класу StringBuffer або класу StringBuilder. в нього методом append () послідовно будуть додані рядки "Це". "Одна". "Рядок". і вийшов об'єкт класу StringBuffer або StringBuilder буде приведений до типу String мето-
Нагадаємо, що символи в рядках зберігаються в кодуванні Unicode, в якій кожен символ займає два байти. Тип кожного символу - char.
Перед роботою з рядком її слід створити, як і об'єкт всякого класу. Це можна зробити різними способами.
Як створити рядок
Найпростіший спосіб створити рядок - це організувати посилання типу String на рядок-константу:
String s1 = "Це рядок.";
String s2 = "Це довга рядок типу String," + "записана в двох рядках вихідного тексту";
Не забувайте про різницю між символом нового рядка String s = "". яка не містить жодного символу, і порожній посиланням String s = null. не вказує ні на який рядок і не є об'єктом.
Найправильніший спосіб створити об'єкт з точки зору ООП - це викликати його конструктор в операції new. Клас String надає вам більш десяти конструкторів:
String () - створюється об'єкт з нового рядка;
String (String str) - конструктор копіювання: з одного об'єкта створюється його
точна копія, а тому цей конструктор використовується рідко;
String (StringBuffer str) - перетворена копія об'єкта класу StringBuffer;
String (StringBuilder str) - перетворена копія об'єкта класу StringBuilder;
String (byte [] byteArray) - об'єкт створюється з масиву байтів byteArray;
String (char [] charArray) - об'єкт створюється з масиву charArray символів Unicode;
String (byte [] byteArray, int offset, int count) - об'єкт створюється з частини массі-
ва байтів byteArray. що починається з індексу offset і містить count байтів;
String (char [] charArray, int offset, int count) - те саме, але масив складається з симво-
String (int [] intArray, int offset, int count) - те саме, але масив складається з символів
Unicode, записаних в масив цілого типу, що дозволяє використовувати символи Unicode, що займають більше двох байтів;
String (byte [] byteArray, String encoding) - символи, записані в масиві байтів,
задаються в Unicode-рядку з урахуванням кодування encoding;
String (byte [] byteArray, int offset, int count, String encoding) - те ж саме, але
тільки для частини масиву;
String (byte [] byteArray, Charset charset) - символи, записані в масиві байтів,
задаються в Unicode-рядку з урахуванням кодування, заданої об'єктом charset;
String (byte [] byteArray, int offset, int count, Charset charset) - те ж саме, але
тільки для частини масиву.
При неправильному завданні індексів offset. count або кодування encoding виникає виняткова ситуація.
Конструктори, що використовують масив байтів byteArray. призначені для створення Unicode-рядка з масиву байтових ASCII-кодувань символів. Така ситуація виникає при читанні ASCII-файлів, витягу інформації з бази даних або при передачі інформації по мережі.
У найпростішому випадку компілятор для отримання двобайтових символів Unicode додасть до кожного байту старший нульовий байт. Вийде діапазон '\ u0000' - '\ u00FF' кодування Unicode, відповідний кодам Latin1. Тексти, записані кирилицею, будуть виведені неправильно.
Якщо ж на комп'ютері зроблені місцеві установки, як кажуть на жаргоні "встановлена локаль" (locale) (в MS Windows це виконується утилітою Regional Options (Мова і стандарти) у вікні Control Panel (Панель керування)), то компілятор, прочитавши ці установки, створить символи Unicode, відповідні місцевої кодової сторінці. В русифікованому варіанті MS Windows це зазвичай кодова сторінка CP1251.
Якщо вихідний масив з кириличним ASCII-текстом був в кодуванні CP1251, то рядок Java буде створена правильно. Кирилиця потрапить в свій діапазон '\ u0400' - '\ u04FF' кодування Unicode.
Але у кирилиці є ще щонайменше чотири кодування:
в MS-DOS застосовується кодування CP866;
в UNIX зазвичай застосовується кодування KOI8-R;
на комп'ютерах Apple Macintosh використовується кодування MacCyrillic;
є ще і міжнародна кодування кирилиці ISO8859-5.
Наприклад, байт 11100011 (0xE3 - в шістнадцятковій формі) в кодуванні CP1251 представляє кириличну букву Г. в кодуванні CP866 - букву у. в кодуванні KOI8- R - букву Ц. в ISO8859-5 - букву у. в MacCyrillic - букву г.
Якщо вихідний кириличний ASCII-текст був в одній з цих кодувань, а місцева кодування - CP1251, то Unicode-символи рядка Java не будуть відповідати кирилиці.
У цих випадках застосовуються останні чотири конструктора, в яких параметром encoding або charset вказується, яку кодову таблицю використовувати конструктору при створенні рядка.
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) System.out.println (msg + "char array." + S1); System.out.println (msg + "default encoding:" + s2); System.out.println (msg + "string constant." + S3); System.out.println (); System.out.println (msg + "Cp1251 -> Cp1251:" + winLikeWin); System.out.println (msg + "Cp1251 -> Cp866." + WinLikeDOS); System.out.println (msg + "Cp1251 -> KOI8-R:" + winLikeUNIX); System.out.println (msg + "Cp866 -> Cp1251:" + dosLikeWin); System.out.println (msg + "Cp866 -> Cp866." + DosLikeDOS); System.out.println (msg + "Cp866 -> KOI8-R:" + dosLikeUNIX); System.out.println (msg + "KOI8-R -> Cp1251:" + unixLikeWin); System.out.println (msg + "KOI8-R -> Cp866." + UnixLikeDOS); System.out.println (msg + "KOI8-R -> KOI8-R:" + unixLikeUNIX); У перші три рядки консолі без перетворення в 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 за правилами виведення в потрібне місце. Ще один спосіб створити рядок - це використовувати два статичних методу:Схожі статті