2009-05-07 42 views
113
de

Esto probablemente ha sido contestada en otro lugar, pero ¿cómo se obtiene el valor del carácter de un valor int?conversión de corriente de int a char de java en

Específicamente estoy leyendo un de un flujo TCP y el método de los lectores .read() devuelve un int.

¿Cómo consigo un char de esto?

+1

No dio detalles sobre qué datos se le envían y lectura. ¿Envía bytes binarios o caracteres Unicode? El método de lectores .read() devuelve un int. Sí, pero devuelve el carácter leído, como un entero en el rango de 0 a 65535 (o -1, esto es porque creo que se utilizó int en lugar de char). Tal vez simplemente usando 'public int read (char [] cbuf)' resolverá el problema? – Vanuan

+0

Las respuestas a esta pregunta no funcionan para JSP Java. Si está utilizando jsp, consulte este error de desbordamiento de pila: http://stackoverflow.com/questions/4621836/how-to-convert-int-to-char-in-jsp-expression-language – NuclearPeon

+0

Creo que esto es válido pregunta. Una de las dificultades de convertir un entero en un carácter, es tratar con valores negativos y valores> = 255. – bvdb

Respuesta

74

Si usted está tratando de convertir una corriente en el texto, es necesario ser conscientes de qué codificación que desea utilizar. A continuación, puede pasar una matriz de bytes en el String constructor y proporcionar una Charset, o utilizar InputStreamReader con el apropiado Charset su lugar.

Simplemente lanzando desde int a char solo funciona si quiere ISO-8859-1, si está leyendo bytes de una secuencia directamente.

EDIT: Si está ya utilizando un Reader, luego colar el valor de retorno de read() a char es el camino correcto a seguir (después de comprobar si se trata de -1 o no) ... pero es normalmente más eficiente y conveniente llamar al read(char[], int, int) para leer todo un bloque de texto a la vez. No olvide verificar el valor de retorno, para ver cuántos caracteres se han leído.

+2

Creo que esto no es lo que el OP está preguntando. Está usando el método de lectura de Reader: http://java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read() La pregunta que está haciendo es cómo convertir el valor devuelto por este método en char. – Vanuan

+3

Si él está utilizando genuinamente Reader, eso ciertamente hace la diferencia. No está claro, dado que él habla sobre un flujo y un lector (con una minúscula r) en la misma oración :(He editado mi respuesta para dejar esto en claro. –

+0

también puede ajustar el 'InputStreamReader' en' BufferedReader' , como se menciona en javadoc http://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html – bvdb

8

de fundición simple:

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

¿Hay alguna razón esto no está trabajando para usted?

+1

Aviso peligroso, si el flujo de texto no es puro ASCII. Ver la respuesta de Jon Skeet arriba. – sleske

+1

Puede que no funcione. Pero creo que sería en realidad. El tipo de datos char almacena el valor codificado en UTF-16. Así que para convertir char a int debes hacer algunas transformaciones. Pero dado que el OP usa el método read() que ya devuelve el valor codificado en UTF-16, creo que el simple casting funcionaría. Corrígeme si me equivoco. – Vanuan

+0

Disculpe, quise decir "de int a char" – Vanuan

142

Tal vez usted está pidiendo:

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

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

convierte el carácter especificado (punto de código Unicode) para su representación UTF-16 se almacena 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 sustituto correspondiente.

+9

Eso solo es válido si el entero en cuestión ya es un punto de código UTF-16. No tenemos idea de si ese es el caso. –

+0

Sí, es correcto, pero se lanzaría un IAE en ese caso. – ATorras

+2

@Atec: No, mi punto es que si él solo está leyendo bytes de una transmisión (no está claro) luego c onvertir simplemente con lanzar o usar 'toChars' es usualmente inapropiado. Si está leyendo de un lector, está bien. –

0

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

+0

esto es como "respuesta" inútil, votaría pero no vale la pena. –

+0

@Lpc_dark Esta respuesta es más correcta que el 90% de las otras respuestas. Ver mi respuesta para más detalles. – bvdb

105

Depende de lo que entendemos por "convertir un int a char".

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

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

Si se refiere a la transformación de la entero 1 en el carácter '1', puede hacerlo de esta manera:

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

+1 ¡Buena respuesta, esto me ayudó! – Aaron

+0

¿Qué pasa si vas de Char a Integer? Integer.parseInt (c)? – Breedly

+0

Esta respuesta es LA :-) – voghDev

29

Si desea simplemente convertir int 5 a Char '5': (Sólo para los enteros 0 - 9)

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

No .. '0' + 5 se convierte en la cadena '05'. El lado derecho debe ser (char) ((int) '0') + i; – toddkaufmann

+0

No es cierto porque los caracteres no se convierten a cadenas en Java. –

+0

+1 - probado, ¡funciona! Pruébalo y pruébalo tú mismo, aparentemente a diferencia de los comentaristas aquí ... –

-2

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

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

Siga sencilla fundido

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

Done !!

+0

eso es EXACTAMENTE lo contrario de lo que estaba pidiendo. – specializt

0

quizá no 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); 
4

Esta solución funciona para el tamaño de la longitud Integer = 1.

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

si el tamaño> 1 tenemos que utilizar para el bucle y recorrer.

1

La mayoría de las respuestas aquí proponen atajos, que pueden ocasionarle grandes problemas si no tiene idea de lo que está haciendo. Si usted quiere tomar atajos, entonces usted tiene que saber exactamente qué codificación los datos están en.

UTF-16

Siempre java habla de personajes en su documentación, se habla acerca de caracteres de 16 bits.

Puede usar un 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 

La cosa es que cada readChar() van a actuar read 2 's y combinarlos para un personaje de 16 bits.

US-ASCII

reservas US-ASCII de 8 bits para codificar 1 carácter. La tabla ASCII solo describe 128 caracteres posibles, por lo que 1 bit no se usa.

Simplemente puede realizar un molde en este caso.

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

ASCII extendido de

UTF-8, Latin-1, ANSI y muchas otras codificaciones utilizan 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 8vo bit ofrece caracteres que son diferentes en todas estas codificaciones. Entonces, aquí las cosas se ponen interesantes.

Si eres un vaquero, y piensas que el 8vo bit no importa (es decir, no te importan los personajes como "à, é, ç, è, ô ...) entonces puedes escapar con un reparto simple.

Sin embargo, si usted quiere hacer esto profesionalmente, realmente debería sIEMPRE especificar un juego de caracteres de texto cada vez que se importa/exportación (por ejemplo, tomas de corriente, archivos ...).

siempre use los conjuntos de caracteres

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

Leer sus datos usando un tampón byte[] y convertir eso a un Stringutilizando un parámetro charset.

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

También puede utilizar un InputStreamReader que se pueden crear instancias con un parámetro charset.

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

1

Basando mi respuesta en el supuesto de que el usuario sólo quería convertir literaaly un int a char, por ejemplo

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

Esto ya ha sido contestada anteriormente, sin embargo, si el valor entero i > 10, entonces es necesario utilizar char array .

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