2010-02-08 28 views
59

¿Hay alguna forma en Java para que pueda obtener el equivalente en Unicode de cualquier carácter? p.ej.Obtener el valor unicode de un carácter

Suponer un método getUnicode(char c). Una llamada getUnicode('÷') debe devolver \u00f7.

+0

Los caracteres ya son unicode en Java. –

Respuesta

50

Puede hacerlo por cualquier carbón Java utilizando el forro aquí:

System.out.println("\\u" + Integer.toHexString('÷' | 0x10000).substring(1)); 

Pero sólo va a trabajar para los caracteres Unicode a Unicode 3.0, que es por qué lo precisé, podrías hacerlo por cualquier char de Java.

Debido a que Java fue diseñado mucho antes de Unicode 3.1 vino y por lo tanto carbón de Java primitivo es inadecuado para representar Unicode 3.1 y arriba: no hay un "carácter de uno de Unicode para un carbón de Java" mapeo más (en lugar se utiliza un truco monstruoso).

Así que realmente tiene que verificar sus requisitos aquí: ¿necesita soportar Java Char o cualquier posible carácter Unicode?

+0

Gracias. He revisado todos los personajes de esta manera y se ve bien por ahora. – Saurabh

+4

El "truco monstruoso" es UTF-16, que es ampliamente utilizado. Puede que no sea lo ideal, pero está bien entendido y es mucho mejor que solo es compatible con UCS-2. –

+1

@Joachim: Sin embargo, tener 'String.charAt' ahora devuelve" medio carácter "y' String.length' devuelve algo que puede ser diferente de la cantidad de caracteres que es feo, ¿no? (el carácter aquí significa el punto de código Unicode, no el carácter de Java) Se suponía que la clase String (y antes de Unicode 3.1) era independiente de los problemas de codificación. – Thilo

0

Encontré este buen código en la web.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Unicode { 

public static void main(String[] args) { 
System.out.println("Use CTRL+C to quite to program."); 

// Create the reader for reading in the text typed in the console. 
InputStreamReader inputStreamReader = new InputStreamReader(System.in); 
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 

try { 
    String line = null; 
    while ((line = bufferedReader.readLine()).length() > 0) { 
    for (int index = 0; index < line.length(); index++) { 

     // Convert the integer to a hexadecimal code. 
     String hexCode = Integer.toHexString(line.codePointAt(index)).toUpperCase(); 


     // but the it must be a four number value. 
     String hexCodeWithAllLeadingZeros = "0000" + hexCode; 
     String hexCodeWithLeadingZeros = hexCodeWithAllLeadingZeros.substring(hexCodeWithAllLeadingZeros.length()-4); 

     System.out.println("\\u" + hexCodeWithLeadingZeros); 
    } 

    } 
} catch (IOException ioException) { 
     ioException.printStackTrace(); 
    } 
} 
} 

Original Article

+2

google for-the-win –

+0

Gracias. Usted me da lo que he pedido. Sin embargo, cuando intento algunos caracteres rusos, devuelve el mismo valor Unicode. Creo que el valor de Unicode debe ser diferente para diferentes personajes. Probé los siguientes caracteres: л, и, ц, т, я retuns \ u003F. – Saurabh

+1

Estoy bastante seguro de que esa parte del código no es correcta para los puntos de código por encima de 0xFFFF. – SyntaxT3rr0r

31

Si tiene Java 5, utilice char c = ...; String s = String.format ("\\u%04x", (int)c);

Si su fuente no es un carácter Unicode (char), sino una cadena, debe utilizar charAt(index) para obtener el carácter Unicode en la posición index.

No utilice codePointAt(index) porque devolverá valores de 24 bits (Unicode completo) que no pueden representarse con solo 4 dígitos hexadecimales (necesita 6). Ver the docs for an explanation.

[EDIT] Para que quede claro: Esta respuesta no utiliza Unicode, pero el método que utiliza Java para representar caracteres Unicode (es decir, pares de sustitución) ya que char es de 16 bits y Unicode es de 24 bits. La pregunta debería ser: "¿Cómo puedo convertir char en un número hexadecimal de 4 dígitos?", Ya que no es (realmente) acerca de Unicode.

+0

envía el mensaje char a int first – Bozho

+2

@Aaron Digulla: es un error común pensar que charAt (...) devuelve un carácter Unicode. No es así charAt (...) solo devuelve un carácter Unicode si su Cadena está compuesta de caracteres Unicode 3.0/BMP. No estoy de acuerdo con que no deba usar codePointAt. Debería usar codePointAt y un método que es capaz de codificar caracteres fuera del BMP. – SyntaxT3rr0r

+0

codePoint. Sería mejor, pero suponiendo que realmente lo necesita, es difícil determinar el valor correcto para el índice. – Thilo

9
private static String toUnicode(char ch) { 
    return String.format("\\u%04x", (int) ch); 
} 
+5

Copia una respuesta existente de 3 años anterior. –

4
char c = 'a'; 
String a = Integer.toHexString(c); // gives you---> a = "61" 
0

es usted exigente con el uso de Unicode, ya que con java es más simple si usted escribe su programa para usar "DEC" valor o (código HTML) tipos de datos, entonces puede simplemente emitidos entre carbón y int

char a = 98; 
char b = 'b'; 
char c = (char) (b+0002); 

System.out.println(a); 
System.out.println((int)b); 
System.out.println((int)c); 
System.out.println(c); 

da esta salida

b 
98 
100 
d 
0

En primer lugar, tengo la parte alta del carbón. Después, toma el lado bajo. Convierta todas las cosas en HexString y ponga el prefijo.

int hs = (int) c >> 8; 
int ls = hs & 0x000F; 

String highSide = Integer.toHexString(hs); 
String lowSide = Integer.toHexString(ls); 
lowSide = Integer.toHexString(hs & 0x00F0); 
String hexa = Integer.toHexString((int) c); 

System.out.println(c+" = "+"\\u"+highSide+lowSide+hexa); 
Cuestiones relacionadas