2009-05-07 11 views
113

Probabilmente è stata data un'altra risposta, ma come si ottiene il valore del carattere di un valore int?Conversione del flusso di int in char in java

In particolare, sto leggendo a da un flusso TCP e il metodo .read() dei lettori restituisce un int.

Come ottengo un carattere da questo?

+1

Lei non ha elaborato su quali dati si inviare e leggere. Invia byte binari o caratteri Unicode? Il metodo dei lettori .read() restituisce un int. Sì, ma restituisce il carattere letto, come un numero intero compreso tra 0 e 65535 (o -1, perché penso che int sia usato al posto di char). Forse solo l'uso di 'public int read (char [] cbuf)' risolverà il problema? – Vanuan

+0

Le risposte a questa domanda non funzionano per JSP Java. Se utilizzi jsp, consulta questo errore di overflow dello stack: http://stackoverflow.com/questions/4621836/how-to-convert-int-to-char-in-jsp-expression-language – NuclearPeon

+0

Penso che questo sia valido domanda. Una delle difficoltà nella conversione di un intero in un carattere, riguarda valori e valori negativi> = 255. – bvdb

risposta

74

Se si sta tentando di convertire un flusso in testo, è necessario essere consapevoli di quale codifica si desidera utilizzare. È quindi possibile passare una matrice di byte nel costruttore String e fornire uno Charset oppure utilizzare InputStreamReader con l'appropriato Charset.

Basta lanciare da int a char funziona solo se si desidera ISO-8859-1, se stai leggendo byte da un flusso diretto.

EDIT: Se siete già utilizzando un Reader, poi gettando il valore di ritorno di read() al char è la strada giusta da percorrere (dopo aver verificato che si tratti di -1 o meno) ... ma è normalmente più efficiente e conveniente chiamare read(char[], int, int) per leggere un intero blocco di testo alla volta. Non dimenticare di controllare il valore restituito, per vedere quanti caratteri sono stati letti.

+2

Penso che questo non sia ciò che l'OP sta chiedendo. Sta usando il metodo di lettura di Reader: http://java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read() La domanda che sta chiedendo è come convertire il valore restituito da questo metodo in char. – Vanuan

+3

Se sta davvero usando Reader, questo fa sicuramente la differenza. Non è chiaro, dato che parla di un flusso e di un lettore (con una minuscola r) nella stessa frase :(Ho modificato la mia risposta per chiarire questo: –

+0

puoi anche racchiudere 'InputStreamReader' in un' BufferedReader'. , come menzionato nel javadoc http://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html – bvdb

8

Semplice casting:

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

c'è qualche ragione questo non sta funzionando per voi?

+1

Avviso pericoloso, se il flusso di testo non è puro ASCII. Vedi la risposta di Jon Skeet sopra. – sleske

+1

Potrebbe non funzionare. Ma penso che sarebbe in realtà. Il tipo di dati char memorizza il valore codificato UTF-16. Quindi per trasmettere char a int hai bisogno di fare alcune trasformazioni. Ma poiché l'OP usa il metodo read() che già restituisce il valore codificato in UTF-16, il casting semplice funzionerebbe, credo. Correggimi se sbaglio – Vanuan

+0

Mi spiace, intendevo "da int a char" – Vanuan

142

Forse si sta chiedendo:

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

Maggiori informazioni: Character.toChars(int codePoint)

Converte il carattere specificato (Unicode punto di codice) per la sua rappresentazione UTF-16 memorizzato in un array di caratteri. Se il punto di codice specificato è un valore BMP (Basic Plilingual Plane o Plane 0), il char array risultante ha lo stesso valore di codePoint. Se il punto di codice specificato è un punto di codice supplementare, il char array risultante ha la coppia surrogata corrispondente.

+9

Questo è valido solo se il numero intero in questione è già un punto di codice UTF-16. Non abbiamo idea se questo sia il caso –

+0

Sì, è vero, ma in questo caso verrebbe generata una IAE – ATorras

+2

@Atec: No, il mio punto è che se sta solo leggendo i byte da un flusso (non è chiaro) quindi c l'inversione mediante il solo cast o l'uso di 'toChars' è in genere inappropriata. Se legge da un Reader, allora va bene. –

0

Questo dipende interamente dalla codifica dei dati in entrata.

+0

questo è come "risposta" inutile, ho giù voto, ma non ne vale la pena. –

+0

@Lpc_dark Questa risposta è più corretta del 90% delle altre risposte. Vedi la mia risposta per maggiori dettagli. – bvdb

105

Dipende da cosa intendi per "convertire un int in carattere".

Se si desidera semplicemente il cast del valore nel int, si può lanciare utilizzando typecast la notazione di Java:

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

se si intende trasformare l'intero 1 nel carattere '1', si può fare in questo modo:

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

+1 Buona risposta, questo mi ha aiutato! – Aaron

+0

E se tu andassi da Char a Integer? Integer.parseInt (c)? – Breedly

+0

Questa risposta è QUELLA :-) – voghDev

29

Se si desidera convertire semplicemente int 5 a char '5': (solo per gli interi 0 - 9)

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

No .. '0' + 5 diventa la stringa '05'. Il lato destro dovrebbe essere (char) ((int) '0') + i; – toddkaufmann

+0

Non vero perché i caratteri non vengono convertiti in stringhe in Java. –

+0

+1: provato e testato, funziona! Prova e prova tu stesso, apparentemente diverso dai commentatori qui ... –

-2

La risposta per la conversione di char in int o long è semplice.

Ad esempio: - se si desidera convertire Char '0' in long.

Seguire semplice getto

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

Done !!

+0

questo è ESATTAMENTE il contrario di quello che stava chiedendo. – specializt

0

forse non il più veloce:

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

Questa soluzione funziona per le dimensioni di lunghezza Integer = 1.

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

se la dimensione> 1 abbiamo bisogno di usare per il ciclo e scorrere.

1

La maggior parte delle risposte qui propone scorciatoie, che possono portare grossi problemi se non si ha idea di cosa si stia facendo. Se si vuole prendere scorciatoie, allora dovete sapere esattamente che cosa codifica i dati sono in.

UTF-16

Ogni volta java parla di personaggi di sua documentazione, si parla caratteri circa 16-bit.

È possibile utilizzare uno DataInputStream, che dispone di metodi convenienti. Per efficienza, avvolgilo in un BufferedReader.

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

Il fatto è che ogni readChar() sarà effettivamente eseguire 2 read 's e combinarle a un carattere a 16 bit.

US-ASCII

riserve US-ASCII 8 bit per codificare 1 carattere. La tabella ASCII descrive solo 128 caratteri possibili, quindi 1 bit è sempre inutilizzato.

In questo caso è sufficiente eseguire un cast.

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

ASCII esteso

UTF-8, Latin-1, ANSI e molte altre codifiche usano tutti gli 8-bit. I primi 7 bit seguono la tabella ASCII e sono identici a quelli della codifica US-ASCII. Tuttavia, l'ottavo bit offre caratteri diversi in tutte queste codifiche. Quindi, qui le cose si fanno interessanti.

Se sei un cowboy, e pensi che l'ottavo bit non abbia importanza (cioè non ti importa di personaggi come "à, é, ç, è, ô ...) allora puoi scappare con un semplice getto.

Tuttavia, se si vuole fare questo in modo professionale, si dovrebbe davvero sEMPRE specificare un set di caratteri ogni volta che si importa il testo/export (per esempio socket, file ...).

usa sempre i set di caratteri

Facciamo sul serio.Tutte le opzioni di cui sopra sono trucchi a buon mercato.Se vuoi scrivere software flessibile hai bisogno per supportare un set di caratteri configurabile per importare/esportare i dati.Ecco una soluzione generica:

Leggere i dati utilizzando un buffer byte[] e per la conversione che per un Stringutilizzando un parametro charset.

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

È inoltre possibile utilizzare un InputStreamReader che può essere istanziato con un parametro charset.

Solo un'altra regola d'oro: non assegnare mai direttamente un byte a un personaggio. È sempre un errore.

1

Basando la mia risposta sul presupposto che l'utente voleva solo per convertire literaaly un int per char, ad esempio

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

Ciò è stato già risposto in precedenza, se il valore intero i > 10, quindi bisogno di usare char array .

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