2009-05-07 16 views
113

Prawdopodobnie odpowiedziano na pytanie gdzie, ale jak uzyskać wartość znakową wartości int?Konwersja strumienia int na char w java

W szczególności czytam a ze strumienia tcp, a czytniki .read() zwracają int.

Jak mogę otrzymać znak char z tego?

+1

Nie opracowania na jakie dane są Ci wysyłanie i czytanie. Czy wysyłasz bajty binarne lub znaki Unicode? Metoda read .read() zwraca wartość int. Tak, ale zwraca odczytany znak, jako liczba całkowita z zakresu od 0 do 65535 (lub -1, ponieważ myślę, że int jest używane zamiast char). Może po prostu użycie 'public int read (char [] cbuf)' rozwiąże problem? – Vanuan

+0

Odpowiedzi na to pytanie nie działają dla JSP Java. Jeśli używasz jsp, zobacz ten błąd przepełnienia stosu: http://stackoverflow.com/questions/4621836/how-to-convert-int-to-char-in-jsp-expression-language – NuclearPeon

+0

Myślę, że to jest poprawne pytanie. Jedną z trudności związanych z przekształcaniem liczby całkowitej na znak jest przetwarzanie wartości ujemnych i wartości> = 255. – bvdb

Odpowiedz

74

Jeśli próbujesz przekonwertować strumień na tekst, musisz wiedzieć, którego kodowania chcesz użyć. Następnie można przekazać tablicę bajtów do konstruktora String i podać wartość Charset lub zamiast tego użyć InputStreamReader z odpowiednim Charset.

Po prostu odlewanie z na char działa tylko wtedy, gdy potrzebujesz ISO-8859-1, jeśli czytasz bajty bezpośrednio ze strumienia.

EDIT: Jeśli już przy użyciu Reader, a następnie rzucając wartość zwracaną read() do char jest właściwa droga (po sprawdzeniu czy jest -1 lub nie) ... ale to jest zwykle bardziej efektywne i wygodnie zadzwonić pod numer read(char[], int, int), aby przeczytać cały blok tekstu na raz. Nie zapomnij jednak sprawdzić wartości zwracanej, aby sprawdzić, ile znaków zostało przeczytanych.

+2

Myślę, że nie o to pyta PO. Używa metody odczytu Readera: http://java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read() Pytanie, które zadaje to konwersja wartości zwróconej przez ta metoda w char. – Vanuan

+3

Jeśli naprawdę korzysta z Czytnika, to z pewnością robi różnicę. Nie jest to jasne, biorąc pod uwagę, że mówi on o strumieniu i czytniku (małymi literami r) w tym samym zdaniu :(Zmieniono moją odpowiedź, aby to wyjaśnić: –

+0

można również zawinąć 'InputStreamReader' w' BufferedReader' , jak wspomniano w javadoc http://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html – bvdb

8

Proste odlewy:

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

Czy jest jakiś powód, nie jest to praca dla Ciebie?

+1

Niebezpieczna rada, jeśli strumień tekstu nie jest czystym ASCII. Zobacz odpowiedź Jona Skeeta powyżej. – sleske

+1

Może nie działać. Ale myślę, że tak było. Typ danych char przechowuje zakodowaną wartość UTF-16. Aby rzucić char na int, musisz wykonać pewne transformacje. Ale ponieważ OP używa metody read(), która już zwraca wartość zakodowaną w UTF-16, zwykłe odlewanie powinno działać. Popraw mnie, jeśli się mylę. – Vanuan

+0

Przepraszam, miałem na myśli "od int do char" – Vanuan

142

Może prosicie:

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

Więcej informacji: Character.toChars(int codePoint)

konwertuje określony znak (punkt kodowy Unicode) do jego reprezentacji UTF-16 przechowywane w tablicy char. Jeśli podany punkt kodowy jest wartością BMP (podstawowa wielojzyczna płaszczyzna lub płaszczyzna 0), wynikowa tablica znaków ma tę samą wartość, co kodPoint. Jeśli określony punkt kodowy jest dodatkowym punktem kodowym, wynikowa tablica znaków ma odpowiednią zastępczą parę.

+9

To tylko ważne jeśli ta liczba całkowita jest już punktem kodowania UTF-16, nie mamy pojęcia, czy tak jest.) –

+0

Tak, zgadza się, ale IAE zostałoby wrzucone w tej sprawie – ATorras

+2

@Atec: Nie, moim celem jest to, że jeśli on tylko czyta bajty ze strumienia (to nie jest jasne), a następnie c Odwracanie przez zwykłe rzutowanie lub używanie 'toChars' jest zwykle niewłaściwe. Jeśli czyta z Czytelnika, jest w porządku. –

0

Jest to całkowicie zależne od kodowania przychodzących danych.

+0

to jest taka bezużyteczna "odpowiedź", głosowałbym w dół, ale to nawet nie jest tego warte. –

+0

@Lpc_dark Ta odpowiedź jest poprawniejsza niż 90% innych odpowiedzi. Zobacz moją odpowiedź, aby uzyskać więcej informacji. – bvdb

105

To zależy od tego, co masz na myśli przez "przekonwertować int na char".

Jeśli chcesz po prostu rzucić wartość w int, można oddać go za pomocą typecast notację Javy:

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

Jeśli masz na myśli przekształcenie całkowitą 1 do znaku „1”, można to zrobić tak:

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

+1 Dobra odpowiedź, pomogło mi to! – Aaron

+0

Co jeśli wybierasz się z Char do Integer? Integer.parseInt (c)? – Breedly

+0

Ta odpowiedź jest TAK :-) – voghDev

29

Jeśli chcesz po prostu przekonwertować int do char 5 '5': (tylko dla liczb całkowitych 0 - 9)

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

Nie. "0" + 5 staje się ciągiem "05". Prawa strona powinna być (char) ((int) "0") + i; – toddkaufmann

+0

Nieprawda, ponieważ znaki nie są konwertowane na ciągi znaków w języku Java. –

+0

+1 - wypróbowany i przetestowany, to działa! Spróbuj i przetestuj to sam, pozornie niepodobny do komentatorów tutaj ... –

-2

Odpowiedzią na konwersję znaku char na int lub długą jest proste rzutowanie.

Na przykład: - jeśli chcesz przekonwertować znak "0" na długi.

Wykonaj proste oddanych

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

Done !!

+0

thats DOKŁADNIE przeciwieństwo tego, co on pytał. – specializt

0

może nie najszybciej jednym:

//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); 
4

To rozwiązanie działa dla rozmiaru długość całkowita = 1.

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

jeśli rozmiar> 1 musimy użyć pętli for i iterację.

1

Większość odpowiedzi tutaj proponuje skróty, które mogą spowodować duże problemy, jeśli nie masz pojęcia, co robisz. Jeśli chcesz wziąć skróty, to trzeba dokładnie wiedzieć, jakiego kodowania danych jest w.

UTF-16

Ilekroć rozmowy java o znaków w jego dokumentacji, mówi o 16-bitowych znaków.

Można użyć DataInputStream, który ma wygodne metody. Aby uzyskać efektywność, zawiń go w BufferedReader.

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

Chodzi o to, że każdy readChar() rzeczywiście wykonać 2 read „s i połączyć je do jednego 16-bitowego znaku.

US-ASCII

rezerwy US-ASCII 8 bitów do kodowania 1 znak. Tabela ASCII opisuje tylko 128 możliwych znaków, więc 1 bit jest zawsze nieużywany.

Możesz po prostu wykonać rzutowanie w tym przypadku.

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

rozszerzony ASCII

UTF-8, Latin-1, ANSI i wiele innych kodowań korzystać ze wszystkich 8-bitów. Pierwsze 7-bitowe są zgodne z tabelą ASCII i są identyczne z kodowaniem US-ASCII. Jednak ósmy bit oferuje znaki, które różnią się we wszystkich tych kodowaniach. Tutaj sprawy stają się interesujące.

Jeśli jesteś kowbojem i myślisz, że ósmy bit nie ma znaczenia (np. Nie interesują cię takie postacie jak "à, é, ç, è, ô ...), wtedy możesz uciec z prostym obsady.

jeśli jednak chcesz to zrobić profesjonalnie, należy naprawdę zawsze określić charset dowolnym momencie importu/eksportu tekstu (np gniazda, pliki ...).

Zawsze używaj charsets

Bądźmy poważni, wszystkie powyższe opcje to tanie sztuczki. Jeśli chcesz pisać elastyczne oprogramowanie, potrzebujesz do obsługi konfigurowalnego zestawu znaków do importowania/eksportowania danych.Oto ogólny rozwiązanie:

Odczyt danych stosując bufor byte[] i przekonwertować do Stringużyciu parametru charset.

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

Można również użyć InputStreamReader który może być tworzony z parametru charset.

Jeszcze jedna złota zasada: nigdy bezpośrednio nie rzucaj bajtu na postać. To zawsze błąd.

1

Opierając moją odpowiedź na założeniu, że użytkownik po prostu chciał literaaly przekształcić int do char np

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

Zostało już odpowiedział powyżej, jednak jeżeli wartość całkowitą i > 10, następnie trzeba użyć char array .

char[] c = String.valueOf(i).toCharArray(); 
1
int i = 7; 
    char number = Integer.toString(i).charAt(0); 
    System.out.println(number);