Преобразование потока int в char в java - PullRequest
114 голосов
/ 07 мая 2009

На этот вопрос, вероятно, ответили еще где, но как получить значение символа для значения типа int?

В частности, я читаю из потока tcp, а метод reader .read () возвращает int.

Как мне получить от этого персонажа?

Ответы [ 12 ]

144 голосов
/ 07 мая 2009

Может быть, вы просите:

Character.toChars(65) // returns ['A']

Подробнее: Character.toChars(int codePoint)

Преобразует указанный символ (кодовая точка Unicode) в его представление UTF-16, хранящееся в массиве символов. Если указанная кодовая точка представляет собой значение BMP (базовая многоязычная плоскость или плоскость 0), результирующий массив символов будет иметь то же значение, что и codePoint. Если указанная кодовая точка является дополнительной кодовой точкой, результирующий массив символов имеет соответствующую суррогатную пару.

105 голосов
/ 10 ноября 2011

Это зависит от того, что вы подразумеваете под "конвертировать int в char".

Если вы просто хотите преобразовать значение в int, вы можете преобразовать его, используя нотацию типа Typecast:

int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'

Если вы хотите преобразовать целое число 1 в символ «1», вы можете сделать это следующим образом:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
74 голосов
/ 07 мая 2009

Если вы пытаетесь преобразовать поток в текст, вам необходимо знать, какую кодировку вы хотите использовать. Затем вы можете либо передать массив байтов в конструктор String и предоставить Charset, либо использовать InputStreamReader с соответствующим Charset вместо.

Простое приведение от int к char работает, только если вы хотите ISO-8859-1, если вы читаете байты из потока напрямую.

РЕДАКТИРОВАТЬ: Если вы уже уже используете Reader, то приведение возвращаемого значения от read() к char является правильным способом (после проверки, равно ли оно -1 или нет) ... но обычно более эффективно и удобно вызывать read(char[], int, int), чтобы прочитать весь блок текста за раз. Не забудьте проверить возвращаемое значение, чтобы узнать, сколько символов было прочитано.

29 голосов
/ 19 сентября 2012

Если вы хотите просто конвертировать int 5 в char '5': (Только для целых чисел 0 - 9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';
8 голосов
/ 07 мая 2009

Простое литье:

int a = 99;
char c = (char) a;

Есть ли причина, по которой это не работает для вас?

4 голосов
/ 04 марта 2015

Это решение работает для длины Integer size = 1.

Integer input = 9; Character.valueOf((char) input.toString().charAt(0))

если размер> 1, нам нужно использовать цикл и повторяться.

1 голос
/ 28 декабря 2015
    int i = 7;
    char number = Integer.toString(i).charAt(0);
    System.out.println(number);
1 голос
/ 27 августа 2015

Исходя из моего ответа, предполагая, что пользователь просто хотел буквально преобразовать int в char, например

Input: 
int i = 5; 
Output:
char c = '5'

На это уже отвечали выше, однако, если целое значение i > 10, то нужно использовать char array.

char[] c = String.valueOf(i).toCharArray();
1 голос
/ 23 июля 2015

Большинство ответов здесь предлагают ярлыки, которые могут привести к большим проблемам, если вы не знаете, что делаете. Если вы хотите использовать ярлыки, вы должны точно знать, в какой кодировке находятся ваши данные.

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.

Еще одно золотое правило: никогда не бросайте байту персонажа напрямую. Это всегда ошибка.

0 голосов
/ 17 января 2015

возможно не самый быстрый:

//for example there is an integer with the value of 5:
int i = 5;

//getting the char '5' out of it:
char c = String.format("%s",i).charAt(0); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...