Преобразование потока int в char в java

114

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

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

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

Омар Кухеджи
источник
1
Вы не уточнили, какие данные вы отправляете и читаете. Вы отправляете двоичные байты или символы Unicode? Метод reader .read () возвращает int. Да, но он возвращает прочитанный символ как целое число в диапазоне от 0 до 65535 (или -1, потому что я думаю, что вместо char используется int). Может, простое использование public int read(char[] cbuf)решит проблему?
Вануан,
Ответы на этот вопрос не подходят для JSP Java. Если вы используете jsp, см. Эту ошибку переполнения стека: stackoverflow.com/questions/4621836/…
NuclearPeon
Я думаю, это правильный вопрос. Одна из трудностей преобразования целого числа в символ
связана
Что, если я хочу преобразовать байт, который находится в массиве байтов, в символ, а затем распечатать его на консоли?
Дуг Хауф

Ответы:

74

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

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

EDIT: Если вы которые уже используете Reader, а затем литье возвращаемого значения read()для charправильного путь (после проверки , является ли это -1 или нет) ... но это обычно более эффективных и удобные для вызова read(char[], int, int)читать весь блок текст за раз. Не забудьте проверить возвращаемое значение, чтобы узнать, сколько символов было прочитано.

Джон Скит
источник
2
Я думаю, ОП спрашивает не об этом. Он использует метод чтения Reader: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () Он задает вопрос, как преобразовать значение, возвращаемое этим методом, в char. ,
Вануан,
3
Если он действительно использует Reader, это, безусловно, имеет значение. Это непонятно, учитывая, что он говорит о потоке и читателе (со строчной буквой r) в одном предложении :( Отредактировал свой ответ, чтобы прояснить это.
Джон Скит,
вы также можете обернуть InputStreamReaderв a BufferedReader, как указано в javadoc docs.oracle.com/javase/8/docs/api/java/io/…
bvdb
Почему «Простое преобразование из int в char работает только в том случае, если вам нужен ISO-8859-1»? Это потому, что Java внутренне использует UTF-16, и все символы ISO-8859-1 сохраняют одну и ту же кодовую единицу (биты) в UTF-16?
Себастьен
@ Себастьен: Да, в основном это все.
Джон Скит,
144

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

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

Больше информации: Character.toChars(int codePoint)

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

ATorras
источник
9
Это действительно только в том случае, если рассматриваемое целое число уже является кодовой точкой UTF-16. Мы понятия не имеем, так ли это.
Джон Скит,
2
@Atec: Нет, я хочу сказать, что если он просто читает байты из потока (это не ясно), то преобразование путем простого преобразования или использования toCharsобычно неуместно. Если он читает из Reader, тогда все в порядке.
Джон Скит,
2
Хотя, по общему признанию, вопрос не указывал на это, этот вопрос возникает как первый результат поиска Google по преобразованию кодовых точек ASCII в символы, поэтому я поддерживаю его.
ArtOfWarfare
105

Это зависит от того, что вы подразумеваете под «преобразованием int в char».

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

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);
....
}
Lovubuntu
источник
Что, если бы вы переходили от Char к Integer? Integer.parseInt (с)?
Breedly
Это тот
самый
29

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

int i = 5;
char c = (char) ('0' + i); // c is now '5';
Райан Андерсон
источник
Нет .. '0' + 5 превращается в строку '05'. Правая часть должна быть (char) ((int) '0') + i;
toddkaufmann
Неправда, потому что символы не преобразуются в строки в Java.
Kaushik Shankar
+1 - попробовал, работает! Попробуйте и проверьте это сами, похоже, в отличие от комментаторов здесь ...
Ян Кэмпбелл
8

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

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

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

Юваль Адам
источник
1
Опасный совет, если текстовый поток не является чистым ASCII. См. Ответ Джона Скита выше.
sleske
1
Это может не сработать. Но я думаю, что это действительно так. Тип данных char хранит значение в кодировке UTF-16. Итак, чтобы преобразовать char в int, вам нужно сделать некоторые преобразования. Но поскольку OP использует метод read (), который уже возвращает значение в кодировке UTF-16, я думаю, что простое приведение будет работать. Поправьте меня, если я ошибаюсь.
Вануан,
Извините, я имел в виду «от int к char»
Вануан
это вызовет неожиданные значения кодировки, а не числа
Васил Валчев
4

Это решение работает для целочисленной длины size = 1.

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

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

Спайкер
источник
1

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

UTF-16

Всякий раз, когда java говорит о символах в своей документации, она говорит о 16-битных символах.

Вы можете использовать a 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.

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

bvdb
источник
1

На основании моего ответа на предположении , что пользователь просто хотел literaaly преобразовать intв char, например ,

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

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

char[] c = String.valueOf(i).toCharArray();
src3369
источник
1
    int i = 7;
    char number = Integer.toString(i).charAt(0);
    System.out.println(number);
Шварц Андрей
источник
0

Это полностью зависит от кодировки входящих данных.


источник
это бесполезный «ответ», я бы проголосовал против, но оно того не стоит.
Lpc_dark 02
@Lpc_dark Этот ответ более правильный, чем 90% других ответов. Подробнее см. Мой ответ.
bvdb
0

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

//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); 
Guest89898989
источник
-2

Ответ на преобразование char в int или long - простое приведение.

Например: - если вы хотите преобразовать Char '0' в long.

Следуйте простому составу

Char ch='0';
String convertedChar= Character.toString(ch);  //Convert Char to String.
Long finalLongValue=Long.parseLong(convertedChar);

Готово!!

Дирадж Варне
источник
это ТОЧНО противоположное тому, о чем он просил.
specializt