Conversión de flujo de int a char en java

114

Esto probablemente se haya respondido en otro lugar, pero ¿cómo se obtiene el valor de carácter de un valor int?

Específicamente, estoy leyendo una de una secuencia tcp y el método .read () de los lectores devuelve un int.

¿Cómo obtengo un char de esto?

Omar Kooheji
fuente
1
No dio más detalles sobre qué datos está enviando y leyendo. ¿Envían bytes binarios o caracteres Unicode? El método de los lectores .read () devuelve un int. Sí, pero devuelve el carácter leído, como un número entero en el rango de 0 a 65535 (o -1, esto se debe a que creo que se usa int en lugar de char). ¿Quizás solo usar public int read(char[] cbuf)resolverá el problema?
Vanuan
Las respuestas a esta pregunta no funcionan para JSP Java. Si está utilizando jsp, vea este error de desbordamiento de pila: stackoverflow.com/questions/4621836/…
NuclearPeon
Creo que esta es una pregunta válida. Una de las dificultades de convertir un número entero en un carácter es lidiar con valores negativos y valores> = 255.
bvdb
¿Qué pasa si quiero convertir un byte que está en una matriz de bytes en un carácter y luego imprimirlo en la consola?
Doug Hauf

Respuestas:

74

Si está intentando convertir una secuencia en texto, debe saber qué codificación desea utilizar. A continuación, puede pasar una matriz de bytes al Stringconstructor y proporcionar un Charset, o utilizar InputStreamReaderel apropiado en su Charsetlugar.

Simplemente, la conversión de inta charsolo funciona si desea ISO-8859-1, si está leyendo bytes de una transmisión directamente.

EDITAR: Si ya está usando a Reader, entonces lanzar el valor de retorno de read()to chares el camino correcto a seguir (después de verificar si es -1 o no) ... pero normalmente es más eficiente y conveniente llamar read(char[], int, int)para leer un bloque completo de texto a la vez. Sin embargo, no olvide verificar el valor de retorno para ver cuántos caracteres se han leído.

Jon Skeet
fuente
2
Creo que esto no es lo que pregunta el OP. Está usando el método de lectura de Reader: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () La pregunta que hace es cómo convertir el valor devuelto por este método en char .
Vanuan
3
Si realmente usa Reader, eso ciertamente marca la diferencia. No está claro, dado que habla de una transmisión y un lector (con una r minúscula) en la misma oración :( He editado mi respuesta para aclararlo.
Jon Skeet
también puede envolver el InputStreamReaderen a BufferedReader, como se menciona en el javadoc docs.oracle.com/javase/8/docs/api/java/io/…
bvdb
¿Por qué "simplemente la conversión de int a char solo funciona si quieres ISO-8859-1"? ¿Es porque Java usa UTF-16 internamente y todos los caracteres ISO-8859-1 mantienen la misma unidad de código (bits) en UTF-16?
Sébastien
@Sebastien: Sí, básicamente es eso.
Jon Skeet
144

Quizás estás pidiendo:

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

Más información: Character.toChars(int codePoint)

Convierte el carácter especificado (punto de código Unicode) en su representación UTF-16 almacenada en una matriz de caracteres. Si el punto de código especificado es un valor BMP (Basic Multilingual Plane o Plane 0), la matriz de caracteres resultante tiene el mismo valor que codePoint. Si el punto de código especificado es un punto de código suplementario, la matriz de caracteres resultante tiene el par suplente correspondiente.

ATorras
fuente
9
Eso solo es válido si el número entero en cuestión ya es un punto de código UTF-16. No tenemos idea de si ese es el caso.
Jon Skeet
2
@Atec: No, lo que quiero decir es que si solo está leyendo bytes de una transmisión (no está claro), la conversión con solo emitir o usar toCharssuele ser inapropiado. Si está leyendo de un lector, está bien.
Jon Skeet
2
Si bien es cierto que la pregunta no lo especificó, esta pregunta surge como el primer resultado en una búsqueda de Google para convertir puntos de código ASCII en caracteres, así que la estoy votando.
ArtOfWarfare
105

Depende de lo que quieras decir con "convertir un int en char".

Si simplemente desea convertir el valor en el int, puede convertirlo usando la notación encasillada de Java:

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

Si te refieres a transformar el entero 1 en el carácter '1', puedes hacerlo así:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
Lovubuntu
fuente
¿Y si fueras de Char a Integer? Integer.parseInt (c)?
Breedly
Esta respuesta es LA :-)
voghDev
29

Si simplemente desea convertir int 5 a char '5': (Solo para enteros 0 - 9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';
Ryan Anderson
fuente
No .. '0' + 5 se convierte en la cadena '05'. El lado derecho debe ser (char) ((int) '0') + i;
toddkaufmann
No es cierto porque los caracteres no se convierten en cadenas en Java.
Kaushik Shankar
+1 - probado y probado, ¡funciona! Pruébelo usted mismo, aparentemente a diferencia de los comentaristas aquí ...
Ian Campbell
8

Fundición simple:

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

¿Hay alguna razón por la que esto no le funcione?

Yuval Adam
fuente
1
Advertencia peligrosa, si el flujo de texto no es ASCII puro. Vea la respuesta de Jon Skeet arriba.
sábado
1
Puede que no funcione. Pero creo que en realidad lo haría. El tipo de datos char almacena el valor codificado en UTF-16. Entonces, para lanzar char a int, necesitas hacer algunas transformaciones. Pero dado que el OP usa el método read () que ya devuelve un valor codificado en UTF-16, creo que la conversión simple funcionaría. Corrígeme si me equivoco.
Vanuan
Lo siento, quise decir "de int a char"
Vanuan
esto causará valores de codificación inesperados, no números
Vasil Valchev
4

Esta solución funciona para un tamaño de longitud entero = 1.

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

si el tamaño> 1 necesitamos usar for loop e iterar.

Atacante
fuente
1

La mayoría de las respuestas aquí proponen atajos, que pueden traerle grandes problemas si no tiene idea de lo que está haciendo. Si desea tomar atajos, debe saber exactamente en qué codificación se encuentran sus datos.

UTF-16

Siempre que java habla de caracteres en su documentación, habla de caracteres de 16 bits.

Puede utilizar a DataInputStream, que tiene métodos convenientes. Para mayor eficiencia, envuélvalo en un BufferedReader.

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

El caso es que cada uno readChar()realmente ejecutará 2 ready los combinará en un carácter de 16 bits.

US-ASCII

US-ASCII reserva 8 bits para codificar 1 carácter. Sin embargo, la tabla ASCII solo describe 128 caracteres posibles, por lo que 1 bit siempre está sin usar.

En este caso, simplemente puede realizar un yeso.

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

ASCII extendido

UTF-8, Latin-1, ANSI y muchas otras codificaciones utilizan todos los 8 bits. Los primeros 7 bits siguen la tabla ASCII y son idénticos a los de la codificación US-ASCII. Sin embargo, el octavo bit ofrece caracteres que son diferentes en todas estas codificaciones. Entonces, aquí las cosas se ponen interesantes.

Si eres un vaquero y crees que el octavo bit no importa (es decir, no te importan los personajes como "à, é, ç, è, ô ...) entonces puedes salirte con la tuya con un elenco simple.

Sin embargo, si desea hacer esto de manera profesional, debe especificar SIEMPRE un juego de caracteres cada vez que importe / exporte texto (por ejemplo, sockets, archivos ...).

Utilice siempre juegos de caracteres

Pongámonos serios. Todas las opciones anteriores son trucos baratos. Si desea escribir software flexible, debe admitir un juego de caracteres configurable para importar / exportar sus datos. Aquí tienes una solución genérica:

Lea sus datos usando un byte[]búfer y conviértalo a String usando un parámetro de juego de caracteres .

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

También puede usar un InputStreamReaderque se puede instanciar con un parámetro charset.

Solo una regla de oro más: nunca envíes directamente un byte a un personaje. Eso es siempre un error.

bvdb
fuente
1

Basando mi respuesta en la suposición de que el usuario solo quería convertir literalmente un inta char, por ejemplo

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

Esto ya se ha respondido anteriormente, sin embargo, si el valor entero i > 10, entonces necesita usar char array.

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

Esto depende completamente de la codificación de los datos entrantes.


fuente
esto es como una "respuesta" inútil, votaría en contra pero ni siquiera vale la pena.
Lpc_dark
@Lpc_dark Esta respuesta es más correcta que el 90% de las otras respuestas. Vea mi respuesta para más detalles.
bvdb
0

tal vez no sea el más rápido:

//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); 
Invitado89898989
fuente
-2

La respuesta para la conversión de char a int o long es una conversión simple.

Por ejemplo: - si desea convertir Char '0' en long.

Seguir elenco simple

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

¡¡Hecho!!

Dheeraj Varne
fuente
eso es EXACTAMENTE lo contrario de lo que estaba preguntando.
specializt