Перетворення потоку int's в char's в Java


114

На це, ймовірно, відповіли ще де, але як отримати значення символу int?

Зокрема, я читаю a з потоку tcp, і метод читачів .read () повертає int.

Як я можу отримати від цього чарку?


1
Ви не уточнювали, які дані ви надсилаєте та читаєте. Ви надсилаєте двійкові байти або символи Unicode? Метод читачів .read () повертає int. Так, але він повертає прочитане символу як ціле число в діапазоні від 0 до 65535 (або -1, це тому, що я думаю, що int використовується замість char). Можливо, саме використання public int read(char[] cbuf)вирішить проблему?
Вануан

Відповіді на це питання не працюють для JSP Java. Якщо ви використовуєте JSP, см це переповнення стека помилка: stackoverflow.com/questions/4621836 / ...
NuclearPeon

Я думаю, що це питання справедливе. Однією з труднощів від перетворення цілого числа в char є розгляд негативних значень та значень> = 255.
bvdb

Що робити, якщо я хочу перетворити байт, що знаходиться в байтовому масиві, в символ, а потім надрукувати його на консолі?
Дуг Хауф

Відповіді:


74

Якщо ви намагаєтеся перетворити потік у текст, вам потрібно знати, яке кодування ви хочете використовувати. Потім ви можете або передати масив байтів у Stringконструктор і надати a 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в 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?
Себастьян

@Sebastien: Так, це в основному все.
Джон Скіт

144

Можливо, ви просите:

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

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

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


9
Це справедливо, лише якщо ціле число є вже кодовою точкою UTF-16. Ми не маємо уявлення, чи так це.
Джон Скіт

2
@Atec: Ні, я вважаю, що якщо він просто читає байти з потоку (це не зрозуміло), то перетворення просто шляхом кастингу або використання, toCharsяк правило, недоцільно. Якщо він читає з Читача, то це добре.
Джон Скіт

2
Хоча, правда, у цьому питанні не було вказано, це запитання постає як перший результат пошуку Google для перетворення кодових ASCII-точок у символи, тому я підтримую його.
ArtOfWarfare

105

Це залежить від того, що ви маєте на увазі під "перетворити інт на char".

Якщо ви просто хочете передати значення в int, ви можете передати його, використовуючи позначення на Java 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);
....
}

Що робити, якщо ви їхали з Чар до Цілого? Integer.parseInt (c)?
Breedly

Ця відповідь: Один :-)
voghDev

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

Неправда, оскільки символи не перетворюються на Strings на Java.
Каушик Шанкар

+1 - перевірено, це працює! Спробуйте самі випробувати його, схоже на відміну від коментаторів тут ...
Іван Кемпбелл

8

Простий кастинг:

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

Чи є якась причина, що це не працює для вас?


1
Небезпечні поради, якщо текстовий потік не є чистим ASCII. Дивіться відповідь Джона Скіта вище.
sleske

1
Це може не спрацювати. Але я думаю, що це було б насправді. Тип даних char зберігає закодоване значення UTF-16. Отже, щоб подати char до int, вам потрібно зробити деякі перетворення. Але оскільки ОП використовує метод read (), який вже повертає кодоване значення UTF-16, простий кастинг буде працювати, я думаю. Виправте мене, якщо я помиляюся.
Вануан

Вибачте, я мав на увазі "від int to char"
Вануан

це призведе до несподіваних значень кодування, а не до числа
Василь Валчев

4

Це рішення працює для розміру Integer length = 1.

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

якщо розмір> 1 нам потрібно використовувати для циклу і повторити його.


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-бітний символ.

США-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, який може бути екземпляром.

Ще одне золоте правило: ніколи не кидайте байт персонажу. Це завжди помилка.


1

На основі моєї відповіді на припущенні, що користувач просто хотів буквально перетворити intна char, наприклад

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

На це вже було сказано вище, однак якщо ціле значення i > 10, то потрібно використовувати char array.

char[] c = String.valueOf(i).toCharArray();


0

Це повністю залежить від кодування вхідних даних.


це така марна "відповідь", я би голосувати, але це навіть не варто.
Lpc_dark

@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); 

-2

Відповідь на перетворення char в int або long - це просте кастинг.

Наприклад: - якщо ви хочете перетворити Char '0' у довгий.

Дотримуйтесь простого акторського складу

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

Готово !!


це точно протилежне тому, що він просив.
спеціаліз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.