Если же на компьютере сделаны местные установки, как говорят на жаргоне "установлена локаль" (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 указывается, какую кодовую таблицу использовать конструктору при создании строки.
class StringTest{
null, | winLikeUNIX = | null |
null, | dosLikeUNIX = | null |
null, | unixLikeUNIX = | null |
public static void main(String[] args){ String winLikeWin = null, winLikeDOS String dosLikeWin = null, dosLikeDOS String unixLikeWin = null, unixLikeDOS String msg = null; byte[] byteCp1251 = {
(byte)0xD0, (byte)0xEE, (byte)0xF1, (byte)0xF1, (byte)0xE8, (byte)0xFF
};
byte[] byteCp866 = {
(byte)0x90, (byte)0xAE, (byte)0xE1, (byte)0xE1, (byte)0xA8, (byte)0xEF
};
byte[] byteKOI8R = {
(byte)0xF2, (byte)0xCF, (byte)0xD3, (byte)0xD3, (byte)0xC9, (byte)0xD1
};
char[] c = {'Р', 'о', 'с', 'с', 'и', 'я'};
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("Cp866") , | "Cp1251"); | |||
winLikeWin | = new | String(byteCp1251, | "Cp1251"); | // | Правильно |
winLikeDOS | = new | String(byteCp1251, | "Cp866"); | ||
winLikeUNIX | = new | String(byteCp1251, | "KOI8-R"); | ||
dosLikeWin | = new | String(byteCp866, | "Cp1251"); | // | Для консоли |
dosLikeDOS | = new | String(byteCp866, | "Cp866"); | // | Правильно |
dosLikeUNIX | = new | String(byteCp866, | "KOI8-R") ; | ||
unixLikeWin | = new | String(byteKOI8R, | "Cp1251"); | ||
unixLikeDOS | = new | String(byteKOI8R, | "Cp866"); | ||
unixLikeUNIX | = new | String(byteKOI8R, | "KOI8-R") ; | // | Правильно |
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){ e.printStackTrace();
}
System.out.println();
System.out.println();
"char array : | II | + | s1); | |
"default encoding: | II | + | s2); | |
"string constant : | II | + | s3); | |
"Cp1251 -> | Cp1251 | II | + | winLikeWin); |
"Cp1251 -> | Cp866 : | II | + | winLikeDOS); |
"Cp1251 -> | KOI8-R | II | + | winLikeUNIX); |
"Cp866 -> | Cp1251 | II | + | dosLikeWin); |
"Cp866 -> | Cp866 : | II | + | dosLikeDOS); |
"Cp866 -> | KOI8-R | II | + | dosLikeUNIX); |
"KOI8-R -> | Cp1251 | II | + | unixLikeWin); |
"KOI8-R -> | Cp866 : | II | + | unixLikeDOS); |
"KOI8-R -> | KOI8-R | II | + | unixLikeUNIX) |