Chuyển đổi luồng int sang char trong java


114

Điều này có thể đã được trả lời khác, nhưng làm thế nào để bạn lấy giá trị ký tự của một giá trị int?

Cụ thể là tôi đang đọc một luồng tcp và phương thức .read () của reader trả về một int.

Làm thế nào để tôi có được một char từ cái này?


1
Bạn đã không nói rõ về những dữ liệu bạn đang gửi và đọc. Bạn có gửi byte nhị phân hay ký tự Unicode không? Phương thức .read () độc giả trả về một int. Có, nhưng nó trả về ký tự đã đọc, dưới dạng số nguyên trong phạm vi 0 đến 65535 (hoặc -1, điều này là do tôi nghĩ int được sử dụng thay vì char). Có lẽ chỉ cần sử dụng public int read(char[] cbuf)sẽ giải quyết được vấn đề?
Vanuan

Các câu trả lời cho câu hỏi này không hoạt động đối với JSP Java. Nếu bạn đang sử dụng jsp, hãy xem lỗi tràn ngăn xếp này: stackoverflow.com/questions/4621836/…
NuclearPeon

Tôi nghĩ đây là một câu hỏi hợp lệ. Một trong những khó khăn từ việc chuyển đổi một số nguyên cho một char, là đối phó với các giá trị âm và giá trị> = 255.
bvdb

Điều gì sẽ xảy ra nếu tôi muốn chuyển đổi một byte trong một mảng byte thành một ký tự và sau đó in nó ra bảng điều khiển?
Doug Hauf

Câu trả lời:


74

Nếu bạn đang cố gắng chuyển một luồng thành văn bản, bạn cần biết bạn muốn sử dụng bảng mã nào. Sau đó, bạn có thể truyền một mảng byte vào hàm Stringtạo và cung cấp một Charsethoặc sử dụng InputStreamReadervới hàm thích hợp Charsetđể thay thế.

Chỉ cần truyền từ intsang charchỉ hoạt động nếu bạn muốn ISO-8859-1, nếu bạn đang đọc byte từ một luồng trực tiếp.

CHỈNH SỬA: Nếu bạn đang sử dụng a Reader, thì việc truyền giá trị trả về của read()thành charlà cách thích hợp để thực hiện (sau khi kiểm tra xem nó có phải là -1 hay không) ... nhưng thông thường sẽ hiệu quả hơn và thuận tiện hơn khi gọi read(char[], int, int)để đọc toàn bộ khối văn bản tại một thời điểm. Đừng quên kiểm tra giá trị trả về để xem có bao nhiêu ký tự đã được đọc.


2
Tôi nghĩ đây không phải là những gì OP đang yêu cầu. Anh ấy đang sử dụng phương thức đọc của Reader: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () Câu hỏi anh ấy hỏi là làm thế nào để chuyển đổi giá trị được trả về bởi phương thức này thành char .
Vanuan

3
Nếu anh ấy thực sự sử dụng Reader, điều đó chắc chắn tạo ra sự khác biệt. Nó không rõ ràng, vì anh ấy nói về một luồng và một người đọc (với r viết thường) trong cùng một câu :( Đã chỉnh sửa câu trả lời của tôi để làm rõ điều này.
Jon Skeet

bạn cũng có thể kết hợp InputStreamReadermột BufferedReader, như đã đề cập trong javadoc docs.oracle.com/javase/8/docs/api/java/io/…
bvdb

Tại sao "Đơn giản truyền từ int sang char chỉ hoạt động nếu bạn muốn ISO-8859-1"? Có phải vì Java sử dụng UTF-16 bên trong và tất cả các ký tự ISO-8859-1 đều giữ cùng một đơn vị mã (bit) trong UTF-16 không?
Sébastien

@Sebastien: Vâng, về cơ bản là vậy.
Jon Skeet

144

Có thể bạn đang yêu cầu:

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

Thêm thông tin: Character.toChars(int codePoint)

Chuyển đổi ký tự được chỉ định (điểm mã Unicode) thành biểu diễn UTF-16 của nó được lưu trữ trong một mảng char. Nếu điểm mã được chỉ định là giá trị BMP (Mặt phẳng đa ngôn ngữ cơ bản hoặc Mặt phẳng 0), mảng char kết quả có cùng giá trị với codePoint. Nếu điểm mã được chỉ định là điểm mã bổ sung, mảng char kết quả có cặp thay thế tương ứng.


9
Điều đó chỉ hợp lệ nếu số nguyên được đề cập đã là một điểm mã UTF-16. Chúng tôi không biết liệu có phải như vậy không.
Jon Skeet

2
@Atec: Không, quan điểm của tôi là nếu anh ấy chỉ đọc byte từ một luồng (không rõ ràng) thì việc chuyển đổi bằng cách chỉ truyền hoặc sử dụng toCharsthường không phù hợp. Nếu anh ấy đang đọc từ một Reader, thì không sao cả.
Jon Skeet

2
Mặc dù phải thừa nhận rằng câu hỏi không nêu rõ, nhưng câu hỏi này xuất hiện như là kết quả đầu tiên trong một tìm kiếm trên Google để chuyển đổi điểm mã ASCII thành ký tự, vì vậy tôi ủng hộ nó.
ArtOfWarfare 21/12/12

105

Nó phụ thuộc vào những gì bạn có nghĩa là "chuyển đổi một int thành char".

Nếu bạn chỉ muốn truyền giá trị trong int, bạn có thể ép kiểu nó bằng cách sử dụng ký hiệu typecast của Java:

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

Nếu bạn muốn chuyển đổi số nguyên 1 thành ký tự '1', bạn có thể làm như sau:

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

Điều gì sẽ xảy ra nếu bạn chuyển từ Char sang Integer? Integer.parseInt (c)?
Breedly

Câu trả lời này là MỘT :-)
voghDev

29

Nếu bạn chỉ muốn chuyển đổi int 5 thành char '5': (Chỉ dành cho số nguyên 0-9)

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

Không .. '0' + 5 trở thành chuỗi '05'. Phía bên tay phải là (char) ((int) '0') + i;
toddkaufmann

Không đúng vì các ký tự không được chuyển đổi thành Chuỗi trong Java.
Kaushik Shankar

+1 - đã thử và kiểm tra, nó hoạt động! Hãy thử và thử nghiệm nó cho mình, dường như không giống như các bình luận ở đây ...
Ian Campbell

8

Đúc đơn giản:

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

Có lý do gì mà điều này không hiệu quả với bạn?


1
Lời khuyên nguy hiểm, nếu dòng văn bản không phải là ASCII thuần túy. Hãy xem câu trả lời của Jon Skeet ở trên.
sleske

1
Nó có thể không hoạt động. Nhưng tôi nghĩ nó sẽ thực sự. Kiểu dữ liệu char lưu trữ giá trị được mã hóa UTF-16. Vì vậy, để truyền char thành int, bạn cần thực hiện một số phép biến đổi. Nhưng vì OP sử dụng phương thức read () đã trả về giá trị được mã hóa UTF-16, tôi nghĩ rằng việc đúc đơn giản sẽ hoạt động. Sửa cho tôi nếu tôi sai.
Vanuan

Xin lỗi, ý tôi là "từ int sang char"
Vanuan

điều này sẽ gây ra các giá trị mã hóa bất ngờ, không số
Vasil Valchev

4

Giải pháp này phù hợp với kích thước độ dài số nguyên = 1.

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

nếu kích thước> 1 chúng ta cần sử dụng vòng lặp for và lặp qua.


1

Hầu hết các câu trả lời ở đây đề xuất các phím tắt, có thể mang lại cho bạn những vấn đề lớn nếu bạn không biết mình đang làm gì. Nếu bạn muốn sử dụng các phím tắt, thì bạn phải biết chính xác mã hóa dữ liệu của mình.

UTF-16

Bất cứ khi nào java nói về các ký tự trong tài liệu của nó, nó sẽ nói về các ký tự 16 bit.

Bạn có thể sử dụng a DataInputStream, có các phương pháp thuận tiện. Để có hiệu quả, hãy bọc nó trong a BufferedReader.

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

Vấn đề là mỗi thứ readChar()sẽ thực hiện 2 read'và kết hợp chúng thành một ký tự 16 bit.

US-ASCII

US-ASCII dự trữ 8 bit để mã hóa 1 ký tự. Mặc dù vậy, bảng ASCII chỉ mô tả 128 ký tự có thể có, vì vậy 1 bit luôn không được sử dụng.

Bạn chỉ có thể thực hiện cast trong trường hợp này.

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

ASCII mở rộng

UTF-8, Latin-1, ANSI và nhiều bảng mã khác sử dụng tất cả 8-bit. 7 bit đầu tiên tuân theo bảng ASCII và giống với các bit của bảng mã US-ASCII. Tuy nhiên, bit thứ 8 cung cấp các ký tự khác nhau trong tất cả các bảng mã này. Vì vậy, ở đây mọi thứ trở nên thú vị.

Nếu bạn là một cao bồi, và bạn nghĩ rằng bit thứ 8 không quan trọng (tức là bạn không quan tâm đến các ký tự như "à, é, ç, è, ô ...) thì bạn có thể bỏ qua một cách đơn giản.

Tuy nhiên, nếu bạn muốn làm điều này một cách chuyên nghiệp, bạn thực sự LUÔN LUÔN chỉ định một bộ ký tự bất cứ khi nào bạn nhập / xuất văn bản (ví dụ: ổ cắm, tệp ...).

Luôn sử dụng bảng mã

Hãy nghiêm túc đi. Tất cả các tùy chọn trên là thủ thuật rẻ tiền. Nếu bạn muốn viết phần mềm linh hoạt, bạn cần hỗ trợ một bộ ký tự có thể định cấu hình để nhập / xuất dữ liệu của bạn. Đây là một giải pháp chung:

Đọc dữ liệu của bạn bằng cách sử dụng byte[]bộ đệm và để chuyển đổi dữ liệu đó thành một String tham số bộ ký tự .

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

Bạn cũng có thể sử dụng một InputStreamReadercó thể được khởi tạo bằng tham số bộ ký tự.

Chỉ một quy tắc vàng nữa: không bao giờ truyền trực tiếp một byte đến một ký tự. Đó luôn là một sai lầm.


1

Dựa trên câu trả lời của tôi dựa trên giả định rằng người dùng chỉ muốn chuyển đổi văn bản intsang char, chẳng hạn

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

Điều này đã được trả lời ở trên, tuy nhiên nếu giá trị nguyên i > 10thì cần phải sử dụng char array.

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

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

0

Điều này hoàn toàn phụ thuộc vào việc mã hóa dữ liệu đến.


cái này chẳng hạn như "câu trả lời" vô dụng, tôi sẽ bỏ phiếu nhưng nó thậm chí không đáng.
Lpc_dark

@Lpc_dark Câu trả lời này đúng hơn 90% các câu trả lời khác. Xem câu trả lời của tôi để biết thêm chi tiết.
bvdb

0

có thể không phải là nhanh nhất:

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

Câu trả lời cho việc chuyển đổi char thành int hoặc long là đúc đơn giản.

Ví dụ: - nếu bạn muốn chuyển Char '0' thành long.

Theo dõi diễn viên đơn giản

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

Làm xong!!


điều đó hoàn toàn ngược lại với những gì anh ấy đang hỏi.
specializt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.