клас string

компілятор виконає приблизно так:

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 за правилами виведення в потрібне місце.

Ще один спосіб створити рядок - це використовувати два статичних методу:

Схожі статті