2010-01-05 13 views

Respuesta

87

Sólo convertir a int:

char registered = '®'; 
int code = (int) registered; 

De hecho hay una conversión implícita de char a int por lo que no tiene que especificar explícitamente como lo he hecho anteriormente, pero me gustaría hacerlo en este caso para que sea obvio lo que estás tratando de hacer.

Esto dará la unidad de código UTF-16, que es lo mismo que el punto de código Unicode para cualquier carácter definido en el plano multilingüe básico. (Y solo los caracteres BMP se pueden representar como valores char en Java.) Como dice la respuesta de Andrzej Doyle, si quiere el punto de código Unicode de una cadena arbitraria, use Character.codePointAt().

Una vez que tenga la unidad de código UTF-16 o los puntos de código Unicode, pero de los cuales son enteros, depende de usted lo que haga con ellos. Si desea una representación de cadena, debe decidir exactamente qué tipo de la representación que desea. (Por ejemplo, si sabe que el valor siempre estará en el BMP, es posible que desee una representación hexadecimal de 4 dígitos prefijada con U+, por ejemplo, "U+0020" por espacio). Sin embargo, eso está más allá del alcance de esta pregunta, ya que no saber cuáles son los requisitos

+0

¿Funcionará esto para cada char? – Geo

+2

@Geo: Cualquier cosa en el plano multilingüe básico, sí. No puede representar caracteres arriba de U + FFFF en un solo carácter en Java. Pero un char se define efectivamente como un punto de código UTF-16. –

+8

Funciona para cada 'char' que representa un carácter Unicode debajo de' U + FFFF' pero no para cada carácter Unicode, ya que 'char' no puede representar todo Unicode. Dependiendo de la fuente de su 'char', puede que necesite hacer algo más complejo (y realmente debería prepararse también). – JaakkoK

30

Una forma más completa, aunque más detallada, de hacer esto sería usar el método Character.codePointAt. Esto manejará caracteres de "alto sustituto", que no pueden ser representados por un único entero dentro del rango que puede representar un char.

En el ejemplo que ha dado esto no es estrictamente necesario - si el (Unicode) personaje puede caber dentro de una única (Java) char (como la variable local registered), entonces debe estar dentro del rango \u0000 a \uffff , y no tendrá que preocuparse por los pares de sustitución. Pero si está buscando puntos de código potencialmente más altos, desde dentro de una matriz String/char, llamar a este método es prudente para cubrir los casos extremos.

Por ejemplo, en lugar de

String input = ...; 
char fifthChar = input.charAt(4); 
int codePoint = (int)fifthChar; 

uso

String input = ...; 
int codePoint = Character.codePointAt(input, 4); 

Esto no sólo es ligeramente menos código en este caso, pero que se encargará de detección de pares suplentes para usted.

0

Querido amigo, Jon Skeet dijo que puedes encontrar el código decimal del personaje pero no es el código hexadecimal del personaje como debe mencionarse en unicode, por lo que debes representar códigos de caracteres a través de HexCode no en Deciaml.

hay una herramienta de código abierto en http://unicode.codeplex.com que proporciona información completa sobre un personaje o una frase.

por lo que es mejor para crear un programa de análisis que dan un char como parámetro y ahexCode volver como cadena

public static String GetHexCode(char character) 
    { 
     return String.format("{0:X4}", GetDecimal(character)); 
    }//end 

espero que ayude

+0

"por lo que debe representar códigos de caracteres a través de HexCode no en Deciaml" - es un número. Hex vs decimal solo entra en juego cuando se convierte esto en una cadena, y no hay ningún requisito para eso dentro de la pregunta. –

4

En Java, char es técnicamente un "número entero de 16 bits ", así que simplemente puedes convertirlo a int y obtendrás su código. De Oracle:

El tipo de datos char es un carácter Unicode de 16 bits. Tiene un valor mínimo de '\ u0000' (o 0) y un valor máximo de '\ uffff' (o 65,535 inclusive).

Así que simplemente puede convertirlo a int.

char registered = '®'; 
System.out.println(String.format("This is an int-code: %d", (int) registered)); 
System.out.println(String.format("And this is an hexa code: %x", (int) registered)); 
+1

Funciona incluso con el carácter en euros 'String.format ("% x ", (int) '€') == 0x20ac == '\ u20ac'' – ATorras

0

Para mí, sólo "Integer.toHexString (registrado)" funcionaba de la manera que quería:

char registered = '®'; 
System.out.println("Answer:"+Integer.toHexString(registered)); 

Esta respuesta se dará sólo representaciones de cadena lo que por lo general se presentan en las tablas. La respuesta de Jon Skeet explica más.

+1

Como se señaló en los comentarios de mi respuesta, eso se debe a que" la forma en que quería "era producir una representación hexadecimal del código, que no es lo que esta pregunta hizo.El código en sí es un número entero; la cuestión de "Cómo creo una representación hexadecimal de un número entero" es una cuestión diferente. (Para los puntos de código Unicode, también debe considerar cuántos dígitos hexadecimales desea; puede usar 4 para un carácter BMP y 6 para otros, o siempre 6, o siempre un número par, por ejemplo ...) –

+0

aclara lo que escribiste. ¿Qué te hace pensar que el código es entero por definición? Para mí, el código es la combinación de símbolos, no necesariamente números o números enteros. Su respuesta fue realmente muy útil, pero al final dediqué media hora mientras encontraba cómo obtener el código, tal como lo entiendo, tal vez, ahorraría algunos minutos gratis para otros usuarios. –

+2

Así es como lo define Unicode. De http://www.unicode.org/standard/principles.html: "Se asigna un número único a cada elemento de código definido por el estándar Unicode. Cada uno de estos números se denomina punto de código y, cuando se lo menciona en el texto, aparece en forma hexadecimal siguiendo el prefijo "U +". Por ejemplo, el punto de código U + 0041 es el número hexadecimal 0041 (igual al número decimal 65). Representa el carácter "A" en el estándar Unicode ". He editado mi respuesta para dejar en claro por qué la respuesta a "¿cuál es el código para el carácter 'X'" es un número, no una cadena. –

Cuestiones relacionadas