Mengubah aliran int menjadi char di java


114

Ini mungkin telah dijawab di tempat lain tetapi bagaimana Anda mendapatkan nilai karakter dari nilai int?

Secara khusus saya membaca dari aliran tcp dan metode reader .read () mengembalikan sebuah int.

Bagaimana cara mendapatkan char dari ini?


1
Anda tidak merinci data apa yang Anda kirim dan baca. Apakah Anda mengirim byte biner atau karakter Unicode? Metode reader .read () mengembalikan sebuah int. Ya, tetapi mengembalikan karakter yang dibaca, sebagai integer dalam kisaran 0 hingga 65535 (atau -1, ini karena saya pikir int digunakan sebagai pengganti char). Mungkin hanya dengan menggunakan public int read(char[] cbuf)akan menyelesaikan masalah?
Vanuan

Jawaban atas pertanyaan ini tidak berfungsi untuk JSP Java. Jika Anda menggunakan jsp, lihat bug stack overflow ini: stackoverflow.com/questions/4621836/…
NuclearPeon

Saya pikir ini adalah pertanyaan yang valid. Salah satu kesulitan dari mengubah integer menjadi char, adalah berurusan dengan nilai dan nilai negatif> = 255.
bvdb

Bagaimana jika saya ingin mengubah byte yang ada dalam array byte menjadi karakter dan kemudian mencetaknya ke konsol?
Doug Hauf

Jawaban:


74

Jika Anda mencoba mengubah aliran menjadi teks, Anda perlu mengetahui pengkodean mana yang ingin Anda gunakan. Anda kemudian dapat meneruskan larik byte ke dalam Stringkonstruktor dan menyediakan Charset, atau menggunakan InputStreamReaderyang sesuai Charsetsebagai gantinya.

Transmisi dari intke charhanya berfungsi jika Anda menginginkan ISO-8859-1, jika Anda membaca byte dari aliran secara langsung.

EDIT: Jika Anda sedang sudah menggunakan Reader, maka pengecoran nilai kembali dari read()ke charadalah cara yang tepat untuk pergi (setelah memeriksa apakah itu -1 atau tidak) ... tapi itu biasanya lebih efisien dan nyaman untuk menelepon read(char[], int, int)untuk membaca seluruh blok teks pada satu waktu. Jangan lupa untuk memeriksa nilai kembali, untuk melihat berapa banyak karakter yang telah dibaca.


2
Saya pikir ini bukan yang ditanyakan OP. Dia menggunakan metode Reader's read: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () Pertanyaan yang dia ajukan adalah bagaimana mengubah nilai yang dikembalikan oleh metode ini menjadi char .
Vanuan

3
Jika dia benar-benar menggunakan Pustaka, itu pasti membuat perbedaan. Tidak jelas, mengingat dia berbicara tentang aliran dan pembaca (dengan huruf kecil r) dalam kalimat yang sama :( Telah mengedit jawaban saya untuk memperjelas ini.
Jon Skeet

Anda juga dapat membungkusnya InputStreamReaderdalam a BufferedReader, seperti yang disebutkan di javadoc docs.oracle.com/javase/8/docs/api/java/io/…
bvdb

Mengapa "Mentransmisikan dari int ke char hanya berfungsi jika Anda menginginkan ISO-8859-1"? Apakah karena Java menggunakan UTF-16 secara internal, dan semua karakter ISO-8859-1 menyimpan unit kode (bit) yang sama di UTF-16?
Sébastien

@Sebastien: Ya, pada dasarnya itu.
Jon Skeet

144

Mungkin Anda bertanya untuk:

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

Info lebih lanjut: Character.toChars(int codePoint)

Mengonversi karakter yang ditentukan (titik kode Unicode) ke representasi UTF-16 yang disimpan dalam larik karakter. Jika titik kode yang ditentukan adalah nilai BMP (Basic Multilingual Plane atau Plane 0), array karakter yang dihasilkan memiliki nilai yang sama dengan codePoint. Jika titik kode yang ditentukan adalah titik kode tambahan, larik karakter yang dihasilkan memiliki pasangan pengganti yang sesuai.


9
Itu hanya valid jika bilangan bulat yang dipermasalahkan sudah menjadi titik kode UTF-16. Kami tidak tahu apakah itu masalahnya.
Jon Skeet

2
@Atec: Tidak, maksud saya adalah jika dia hanya membaca byte dari aliran (tidak jelas) maka mengonversi dengan hanya mentransmisikan atau menggunakan toCharsbiasanya tidak pantas. Jika dia membaca dari Reader, maka tidak masalah.
Jon Skeet

2
Meskipun memang pertanyaannya tidak menentukannya, pertanyaan ini muncul sebagai hasil pertama dalam pencarian Google untuk mengonversi poin kode ASCII ke karakter, jadi saya menaikkannya.
ArtOfWarfare

105

Itu tergantung pada apa yang Anda maksud dengan "convert an int to char".

Jika Anda hanya ingin memasukkan nilai ke dalam int, Anda dapat mentransmisikannya menggunakan notasi typecast Java:

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

Jika Anda bermaksud mengubah integer 1 menjadi karakter '1', Anda dapat melakukannya seperti ini:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}

Bagaimana jika Anda beralih dari Char ke Integer? Integer.parseInt (c)?
Breedly

Jawaban ini adalah THE satu :-)
voghDev

29

Jika Anda ingin mengubah int 5 menjadi char '5': (Hanya untuk integer 0 - 9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';

Tidak .. '0' + 5 menjadi string '05'. Sisi kanan harus (char) ((int) '0') + i;
toddkaufmann

Tidak benar karena karakter tidak dapat dikonversi ke String di Java.
Kaushik Shankar

+1 - dicoba dan diuji, berhasil! Coba dan uji sendiri, tampaknya tidak seperti pemberi komentar di sini ...
Ian Campbell

8

Casting sederhana:

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

Apakah ada alasan mengapa ini tidak berhasil untuk Anda?


1
Saran berbahaya, jika aliran teks tidak murni ASCII. Lihat jawaban Jon Skeet di atas.
sleske

1
Ini mungkin tidak berhasil. Tapi saya pikir itu akan benar-benar terjadi. Tipe data char menyimpan nilai kode UTF-16. Jadi untuk memasukkan karakter ke int, Anda perlu melakukan beberapa transformasi. Tetapi karena OP menggunakan metode read () yang sudah mengembalikan nilai kode UTF-16, casting sederhana akan berfungsi. Koreksi saya jika saya salah.
Vanuan

Maaf, maksud saya "dari int ke char"
Vanuan

ini akan menyebabkan nilai pengkodean yang tidak terduga, bukan angka
Vasil Valchev

4

Solusi ini berfungsi untuk Integer length size = 1.

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

jika size> 1 kita perlu menggunakan for loop dan melakukan iterasi.


1

Sebagian besar jawaban di sini mengusulkan jalan pintas, yang dapat membawa Anda ke dalam masalah besar jika Anda tidak tahu apa yang Anda lakukan. Jika Anda ingin mengambil jalan pintas, maka Anda harus tahu persis apa pengkodean data Anda.

UTF-16

Setiap kali java berbicara tentang karakter dalam dokumentasinya, ia berbicara tentang karakter 16-bit.

Anda dapat menggunakan DataInputStream, yang memiliki metode yang nyaman. Untuk efisiensi, bungkus dengan a BufferedReader.

// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast

Masalahnya adalah bahwa masing-masing readChar()akan benar-benar melakukan 2 readdan menggabungkannya menjadi satu karakter 16-bit.

US-ASCII

US-ASCII menyimpan 8 bit untuk menyandikan 1 karakter. Tabel ASCII hanya menjelaskan 128 kemungkinan karakter, jadi 1 bit selalu tidak digunakan.

Anda cukup melakukan pemeran dalam kasus ini.

int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;

ASCII diperpanjang

UTF-8, Latin-1, ANSI, dan banyak pengkodean lainnya menggunakan semua 8-bit. 7-bit pertama mengikuti tabel ASCII dan identik dengan salah satu pengkodean US-ASCII. Namun, bit ke-8 menawarkan karakter yang berbeda dalam semua pengkodean ini. Jadi, di sini hal-hal menjadi menarik.

Jika Anda seorang koboi, dan Anda berpikir bahwa bit ke-8 tidak penting (yaitu Anda tidak peduli dengan karakter seperti "à, é, ç, è, ô ...) maka Anda dapat lolos dengan pemeran sederhana.

Namun, jika Anda ingin melakukan ini secara profesional, Anda harus SELALU menentukan rangkaian karakter setiap kali Anda mengimpor / mengekspor teks (mis. Soket, file ...).

Selalu gunakan charsets

Mari serius. Semua opsi di atas adalah trik murah. Jika Anda ingin membuat perangkat lunak yang fleksibel, Anda perlu mendukung rangkaian karakter yang dapat dikonfigurasi untuk mengimpor / mengekspor data Anda. Berikut solusi umum:

Membaca data Anda menggunakan byte[]buffer dan mengubahnya menjadi String menggunakan parameter charset .

byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);

Anda juga bisa menggunakan InputStreamReaderyang bisa dipakai dengan parameter charset.

Hanya satu aturan emas lagi: jangan pernah secara langsung mentransmisikan satu byte ke karakter. Itu selalu salah.


1

Mendasarkan jawaban saya pada asumsi bahwa pengguna hanya ingin literaaly mengkonversi intke char, misalnya

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

Ini telah dijawab di atas, namun jika nilai integer i > 10, maka perlu digunakan char array.

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

1
    int i = 7;
    char number = Integer.toString(i).charAt(0);
    System.out.println(number);

0

Ini sepenuhnya tergantung pada pengkodean data yang masuk.


ini seperti "jawaban" yang tidak berguna, saya tidak akan memilih tetapi bahkan tidak sepadan.
Lpc_dark

@Lpc_dark Jawaban ini lebih tepat dari 90% jawaban lainnya. Lihat jawaban saya untuk lebih jelasnya.
bvdb

0

mungkin bukan yang tercepat:

//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

Jawaban untuk konversi char menjadi int atau long adalah casting sederhana.

Misalnya: - jika Anda ingin mengubah Char '0' menjadi panjang.

Ikuti pemeran sederhana

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

Selesai !!


itu PERSIS kebalikan dari apa yang dia minta.
Spesialisasi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.