java - ¿Cómo puedo obtener el código de un personaje Unicode?
character (6)
Digamos que tengo esto:
char registered = ''®'';
o una umlaut
, o cualquier otro carácter unicode. ¿Cómo podría obtener su código?
En Java, char es técnicamente un "entero de 16 bits", por lo que simplemente puedes convertirlo a int y obtendrás su código. De Oracle :
El tipo de datos char es un solo 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).
Entonces simplemente puedes 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));
Hay una biblioteca de código abierto MgntUtils que tiene una clase de utilidad StringUnicodeEncoderDecoder. Esa clase proporciona métodos estáticos que convierten cualquier cadena en secuencia Unicode vise-versa. Muy simple y útil. Para convertir String, simplemente hazlo:
String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(myString);
Por ejemplo, una cadena "Hello World" se convertirá en
"/ u0048 / u0065 / u006c / u006c / u006f / u0020 / u0057 / u006f / u0072 / u006c / u0064"
Funciona con cualquier idioma. Aquí está el enlace al artículo que explica todos los datos sobre la biblioteca: MgntUtils . Busque el subtítulo "Convertidor de cadena Unicode". El artículo le da un enlace a Maven Central donde puede obtener artefactos y github donde puede obtener el proyecto en sí. La biblioteca viene con un código Java y un código fuente bien escritos.
Para mí, solo "Integer.toHexString (registrado)" funcionó de la manera que yo quería:
char registered = ''®'';
System.out.println("Answer:"+Integer.toHexString(registered));
Esta respuesta le dará solo representaciones de cadenas, que generalmente se presentan en las tablas. La respuesta de Jon Skeet explica más.
Simplemente conviértalo en 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 especificarla explícitamente como hice anteriormente, pero lo haría en este caso para que sea obvio lo que está 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 tiene la unidad de código UTF-16 o los puntos de código Unicode, pero que son enteros, depende de usted lo que haga con ellos. Si desea una representación de cadena, debe decidir exactamente qué tipo de representación 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"
para espacio). Sin embargo, eso está más allá del alcance de esta pregunta, ya que no sabemos cuáles son los requisitos.
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 solo entero dentro del rango que un char
puede representar.
En el ejemplo que ha indicado, esto no es estrictamente necesario: si el carácter (Unicode) puede caber dentro de un solo carácter (Java) (como la variable local registered
), entonces debe estar dentro del /u0000
to /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;
utilizar
String input = ...;
int codePoint = Character.codePointAt(input, 4);
No solo es este código un poco menos en este caso, sino que manejará la detección de pares de sustitución para usted.
querido amigo, Jon Skeet dijo que puedes encontrar el código decimal del personaje, pero no es un código hexadecimal del carácter 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 sentencia.
así que es mejor crear un analizador que dé un carácter como parámetro y devuelva ahexCode como cadena
public static String GetHexCode(char character)
{
return String.format("{0:X4}", GetDecimal(character));
}//end
espero que ayude