При создании строк конструктор String(byte[] byteArray, String encoding) создает Unicode-строку из массива байтовых ASCII-кодировок символов. В самом простом случае компилятор для получения двубайтовых символов Unicode добавит к каждому байту сташий нулевой бит. Получится диапазон '\u0000'-'\u04ff' кодировки Unicode, соответствующий кодам Latin1. Тексты на кириллице будут выведены неправильно. Если на компьютере установлена локаль, то компилятор создаст символы Unicode соответственно местной кодовой странице (в Windows обычно CP1251, в DOS - CP866, *nix - KOI8-R). Если локальная кодировка совпадает с кодировкой выводимых символов, то строка будет верна. Если исходный кириллический ASCII-текст был в одной кодировке, а местная - другая, то Unicode-строки Java не будут соответствовать кириллице. В этих случаях используется этот конструктор, с параметром нужной кодировки. Таким образом, если поток байт выводится и на консоль (CP866) и в файл (CP1251) Windows, то результат будет отличаться. Правильные символы Unicode-кириллицы получаются, если использовать ту же кодовую таблицу, в которой записан исходный массив байт. При выводе же строки на консоль, в окно, в файл или при передаче по сети лучше преобразовать строку Java с символами Unicode по правилам выхода в нужное место.
Пример преобразования 1: для вывода на консоль DOS (Cp866) строки в кодировке Windows (Сp1251)
Дан массив байт:
byte[] byteCp866 ={
(byte)0x90, (byte)0xAE, (byte)0xE1,
(byte)0xE1, (byte)0xA8, (byte)0xEF
};
Создаем строку для вывода в другой кодировке:
dosLikeWin = new String (byteCp866, "Cp1251");
Пример преобразования 2: из Unicode в Windows Cp1251
String newString = new String(oldString.getBytes("UTF-8"), "Cp1251");