Conversione del flusso di int in char in java


114

Probabilmente è stata data una risposta altrove, ma come si ottiene il valore del carattere di un valore int?

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
Non hai elaborato i dati che stai inviando e leggendo. Inviate byte binari o caratteri Unicode? Il metodo .read () dei lettori restituisce un int. Sì, ma restituisce il carattere letto, come un numero intero compreso tra 0 e 65535 (o -1, questo perché penso che int sia usato al posto di char). Forse il solo utilizzo public int read(char[] cbuf)risolverà il problema?
Vanuan

Le risposte a questa domanda non funzionano per JSP Java. Se si sta utilizzando jsp di, vedere questo bug di overflow dello stack: stackoverflow.com/questions/4621836/...
NuclearPeon

Penso che questa sia una domanda valida. Una delle difficoltà nel convertire un numero intero in un carattere è gestire valori e valori negativi> = 255.
bvdb

E se volessi convertire un byte che si trova in un array di byte in un carattere e poi stamparlo sulla console?
Doug Hauf

Risposte:


74

Se stai tentando di convertire uno stream in testo, devi essere consapevole di quale codifica desideri utilizzare. È quindi possibile passare un array di byte al Stringcostruttore e fornire un Charset, oppure utilizzare InputStreamReadercon il metodo appropriato Charset.

Il semplice casting da inta charfunziona solo se si desidera ISO-8859-1, se si leggono direttamente i byte da un flusso.

EDIT: Se si sta già utilizzando una Reader, poi gettando il valore restituito read()al charè la strada giusta da percorrere (dopo aver verificato che si tratti di -1 o meno) ... ma è normalmente più efficiente e conveniente per chiamare read(char[], int, int)a 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 quello che chiede l'OP. Sta usando il metodo di lettura di Reader: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () La domanda che sta facendo è come convertire il valore restituito da questo metodo in char .
Vanuan

3
Se sta davvero usando Reader, fa sicuramente la differenza. Non è chiaro, dato che parla di uno stream e di un lettore (con la r minuscola) nella stessa frase :( Ho modificato la mia risposta per renderlo chiaro.
Jon Skeet

puoi anche racchiudere il InputStreamReaderin un BufferedReader, come menzionato in javadoc docs.oracle.com/javase/8/docs/api/java/io/…
bvdb

Perché "Il semplice casting da int a char funziona solo se si desidera ISO-8859-1"? È perché Java utilizza UTF-16 internamente e tutti i caratteri ISO-8859-1 mantengono la stessa unità di codice (bit) in UTF-16?
Sébastien

@Sebastien: Sì, fondamentalmente è così.
Jon Skeet

144

Forse stai chiedendo:

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

Ulteriori informazioni: Character.toChars(int codePoint)

Converte il carattere specificato (punto di codice Unicode) nella relativa rappresentazione UTF-16 archiviata in una matrice di caratteri. Se il punto di codice specificato è un valore BMP (Basic Multilingual Plane o Plane 0), la matrice di caratteri risultante ha lo stesso valore di codePoint. Se il punto di codice specificato è un punto di codice supplementare, la matrice di caratteri risultante ha la coppia surrogata corrispondente.


9
Ciò è valido solo se il numero intero in questione è già un punto di codice UTF-16. Non abbiamo idea se sia così.
Jon Skeet,

2
@ Atec: No, il punto è che se sta solo leggendo byte da uno stream (non è chiaro), la conversione tramite casting o utilizzo di toCharssolito è inappropriata. Se sta leggendo da un lettore, allora va bene.
Jon Skeet,

2
Anche se è vero che la domanda non l'ha specificata, questa domanda si presenta come il primo risultato di una ricerca su Google per la conversione dei punti di codice ASCII in caratteri, quindi la sto votando.
ArtOfWarfare

105

Dipende da cosa intendi per "converti un int in char".

Se desideri semplicemente eseguire il cast del valore nell'int, puoi eseguire il cast utilizzando la notazione typecast di Java:

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

Se intendi trasformare il numero intero 1 nel carattere '1', puoi farlo in questo modo:

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

E se passassi da Char a Integer? Integer.parseInt (c)?
Breedly

Questa risposta è QUELLA :-)
voghDev

29

Se vuoi semplicemente convertire int 5 in char '5': (solo per interi 0-9)

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

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

Non è vero perché i caratteri non vengono convertiti in stringhe in Java.
Kaushik Shankar

+1 - provato e testato, funziona! Prova a provarlo tu stesso, apparentemente a differenza dei commentatori qui ...
Ian Campbell

8

Colata semplice:

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

C'è qualche motivo per cui questo non funziona per te?


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 lo sarebbe effettivamente. Il tipo di dati char memorizza il valore codificato UTF-16. Quindi per lanciare char in int devi fare alcune trasformazioni. Ma poiché l'OP utilizza il metodo read () che restituisce già il valore codificato UTF-16, penso che il casting semplice funzionerebbe. Correggimi se sbaglio.
Vanuan

Scusa, volevo dire "da int a char"
Vanuan

questo causerà valori di codifica imprevisti, non numeri
Vasil Valchev

4

Questa soluzione funziona per Integer length size = 1.

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

se size> 1 dobbiamo usare il ciclo for e iterare.


1

La maggior parte delle risposte qui propone scorciatoie, che possono portarti a grossi problemi se non hai idea di cosa stai facendo. Se vuoi prendere scorciatoie, devi sapere esattamente in quale codifica si trovano i tuoi dati.

UTF-16

Ogni volta che Java parla di caratteri nella sua documentazione, parla di caratteri a 16 bit.

Puoi usare a DataInputStream, che ha metodi convenienti. Per efficienza, avvolgilo in un file BufferedReader.

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

Il fatto è che ognuno readChar()eseguirà effettivamente 2 reade li combinerà in un carattere a 16 bit.

US-ASCII

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

In questo caso puoi semplicemente 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 utilizzano 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'ottava parte non abbia importanza (cioè non ti interessano personaggi come "à, é, ç, è, ô ...) allora puoi farla franca con un cast semplice.

Tuttavia, se vuoi farlo professionalmente, dovresti davvero specificare SEMPRE un set di caratteri ogni volta che importi / esporti testo (es. Socket, file ...).

Usa sempre i set di caratteri

Facciamo sul serio. Tutte le opzioni di cui sopra sono trucchi economici. Se vuoi scrivere un software flessibile, devi supportare un set di caratteri configurabile per importare / esportare i tuoi dati. Ecco una soluzione generica:

Leggi i tuoi dati utilizzando un byte[]buffer e convertili in un String parametro charset .

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

Puoi anche usare un InputStreamReaderche può essere istanziato con un parametro charset.

Ancora una regola d'oro: non lanciare mai direttamente un byte a un personaggio. È sempre un errore.


1

Basando la mia risposta sul presupposto che l'utente volesse solo convertire letteralmente un intin char, per esempio

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

Questo è già stato risposto sopra, tuttavia, se il valore intero i > 10, è necessario utilizzare char array.

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

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

0

Ciò dipende interamente dalla codifica dei dati in arrivo.


questa è una "risposta" inutile, voterei ma non ne vale nemmeno la pena.
Lpc_dark

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

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

-2

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

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

Segui il cast semplice

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

Fatto!!


questo è ESATTAMENTE l'opposto di quello che stava chiedendo.
specializt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.