Курсовая работа: Java: Русские буквы и не только…
Для преобразования из байтов в символы и обратно следует пользоваться только этими методами. Простое приведение типа использовать в большинстве случаев нельзя - кодировка символов при этом не будет учитываться. Например, одной из самых распространённых ошибок является чтение данных побайтно при помощи метода read() из InputStream, а затем приведение полученного значения к типу char:
InputStream is = ..;
int b;
StringBuffer sb = new StringBuffer();
while( (b=is.read())!=-1 )
{
sb.append( (char)b ); // <- так делать нельзя
}
String s = sb.toString();
Обратите внимание на приведение типа - "(char)b". Значения байтов вместо перекодирования просто скопируются в char (диапазон значений 0-0xFF, а не тот, где находится кириллица). Такому копированию соответствует кодировка ISO-8859-1 (которая один в один соответствует первым 256 значениям Unicode), а значит, можно считать, что этот код просто использует её (вместо той, в которой реально закодированы символы в оригинальных данных). Если Вы попытаетесь отобразить полученное значение - на экране будут или вопросики или кракозяблы. Например, при чтении строки "АБВ" в виндовой кодировке может запросто отобразиться что-то вроде такого: "ÀÁÂ". Подобного рода код часто пишут программисты на западе - с английскими буквами работает, и ладно. Исправить такой код легко - надо просто заменить StringBuffer на ByteArrayOutputStream:
InputStream is = ..;
int b;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while( (b=is.read())!=-1 )
{
baos.write( b );
}
// Перекодирование байтов в строку с использованием кодировки по умолчанию
String s = baos.toString();
// Если нужна конкретная кодировка - просто укажите её при вызове toString():
//
// s = baos.toString("Cp1251");
Более подробно о распространённых ошибках смотрите раздел Типичные ошибки.
8-ми битовые кодировки русских букв
Вот основные 8-ми битовые кодировки русских букв, получившие распространение:
Кодировка | Ареал распространения | Основное название в Java |
IBM-866 | MS-DOS, Windows (OEM-кодировка), OS/2 | Cp866 |
Windows-1251 | Windows (Ansi-кодировка) | Cp1251 |
КОИ-8 | Unix, большинство русскоязычных писем в Internet | KOI8_R |
ISO-8859-5 | Unix | ISO8859_5 |
Macintosh Cyrillic | Mac | MacCyrillic |
Помимо основного названия можно использовать синонимы. Набор их может отличаться в разных версиях JDK. Вот список от JDK 1.3.1:
Cp1251:
Windows-1251
Cp866: