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 String
utilizzando 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.
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
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
Penso che questo sia valido domanda. Una delle difficoltà nella conversione di un intero in un carattere, riguarda valori e valori negativi> = 255. – bvdb