Большинство ответов здесь предлагают ярлыки, которые могут привести к большим проблемам, если вы не знаете, что делаете. Если вы хотите использовать ярлыки, вы должны точно знать, в какой кодировке находятся ваши данные.
UTF-16
Всякий раз, когда java говорит о символах в своей документации, он говорит о 16-битных символах.
Вы можете использовать DataInputStream
, который имеет удобные методы. Для эффективности оберните его в BufferedReader
.
// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast
Дело в том, что каждый readChar()
фактически выполняет 2 read
и объединяет их в один 16-битный символ.
US-ASCII
US-ASCII резервирует 8 бит для кодирования 1 символа. Таблица ASCII описывает только 128 возможных символов, поэтому 1 бит всегда не используется.
В этом случае вы можете просто выполнить приведение.
int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;
расширенный ASCII
UTF-8, Latin-1, ANSI и многие другие кодировки используют все 8-битные. Первые 7 бит следуют за таблицей ASCII и идентичны кодировкам US-ASCII. Однако 8-й бит предлагает символы, которые отличаются во всех этих кодировках. Итак, здесь все становится интересным.
Если вы ковбой, и вы думаете, что 8-й бит не имеет значения (то есть вас не волнуют такие символы, как «а, е, н, е, р ...), тогда вы можете получить прочь с простым броском.
Однако, если вы хотите сделать это профессионально, вам следует ВСЕГДА указывать кодировку всякий раз, когда вы импортируете / экспортируете текст (например, сокеты, файлы ...).
Всегда использовать кодировки
Давайте серьезно. Все вышеперечисленные варианты являются дешевыми трюками. Если вы хотите написать гибкое программное обеспечение, вам нужно поддерживать настраиваемую кодировку для импорта / экспорта ваших данных. Вот общее решение:
Считайте данные, используя буфер byte[]
, и преобразуйте их в String
, используя параметр charset .
byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);
Вы также можете использовать InputStreamReader
, который может быть создан с помощью параметра charset.
Еще одно золотое правило: никогда не бросайте байту персонажа напрямую. Это всегда ошибка.