Java -практика использования

         

Создание кириллических строк



Листинг 5.1. Создание кириллических строк

class StringTest{

public static void main(String[] args){

    String winLikeWin = null, winLikeDOS = null, winLikeUNIX = null; 

    String dosLikeWin = null, dosLikeDOS = null, dosLikeUNIX = null; 

    String unixLikeWin = null, unixLikeDOS = null, unixLikeUNIX = null; 

    String msg = null;

    byte[] byteCp!251 = {

     (byte)0xD0, (byte)0xEE, (byte)0xFl,

     (byte)0xFl, (byte)0xES, (byte)0xFF 

    }; 

    byte[] byteCp866 = {

     (byte)0x90, (byte)0xAE, (byte)0xE1,

     (byte)0xEl, (byte)0xA8, (byte)0xEF 

    }; 

    byte[] byteKOISR = (

     (byte)0xF2, (byte)0xCF, (byte)0xD3,

     (byte)0xD3, (byte)0xC9, (byte)0xDl

    };

    char[] с = {'Р', 'о', 'с', 'с', 'и', 'я'};

    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("Ср866"), "Cpl251");

      winLikeWin = new String(byteCp1251, "Cpl251");
  //Правильно

      winLikeDOS = new String(byteCpl251,: "Cp866");

      winLikeUNIX - new String(byteCp1251, "KOI8-R");

      dosLikeWin = new String(byteCp866, "Cpl251");
  // Для консоли

      dosLikeDOS = new String(byteCp866, "Cp866");
   // Правильно

      dosLikeUNIX = new String(byteCp866, "KOI8-R");

      unixLikeWin = new String(byteKOISR, "Cpl251");

      unixLikeDOS = new String(byteKOISR, "Cp866");

      unixLikeUNIX = new String(byteKOISR, "KOI8-R");
  // Правильно

      System.out.print(msg + "Cpl251: ");

      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();

    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 ->
Cpl251: " + unixLikeWin);
 

    System.out.println(msg + "KOI8-R ->
Cp866 : " + unixLikeDOS);
 

    System.out.println(msg + "KOI8-R ->
KOI8-R: " + unixLikeUNIX);
 

  } 

}

Все эти данные выводятся на консоль MS Windows 2000, как показано на Рисунок 5.1.

В первые три строки консоли выводятся массивы байтов byteCP1251 , byteCP866 и byteKOI8R без преобразования в Unicode. Это выполняется методом write() класса FilterOutputStream из пакета java.io .

В следующие три строки консоли выведены строки Java, полученные из массива символов с[] , массива byteCP866 и строки-константы.

Следующие строки консоли содержат преобразованные массивы.

Вы видите, что на консоль правильно выводится только массив в кодировке СР866, записанный в строку с использованием кодовой таблицы СР1251.

В чем дело? Здесь свой вклад в проблему русификации вносит вывод потока символов на консоль или в файл.



Содержание раздела