2009-12-20 40 views
5

Estoy desarrollando un lenguaje, un lenguaje de juguete. La sintaxis \#0061 se supone que debe convertir el Unicode dado a un personaje:Conversión de Unicode a cadena en Java

String temp = yytext().subtring(2); 

Luego, después de que intenta anexar '\u' a la cadena, he notado que genera un error.

También traté de "\\" + "u" + temp; de esta manera no hace ninguna conversión.

Básicamente estoy tratando de convertir Unicode a un personaje mediante el suministro de '0061' a un método, ayuda.

+0

Tenga en cuenta que 16 bits (4 dígitos hexadecimales) no es suficiente para representar todos los caracteres en Unicode. En java "\ u1234" se asigna a una unidad de punto de código en UTF-16, que no es lo mismo que un carácter. –

+0

Adición: De hecho, es el tipo de datos java que se asigna a las unidades de puntos de código UTF-16, no a los caracteres Unicode reales. –

Respuesta

11

Pele el '#' y use Integer.parseInt("0061", 16) para convertir los dígitos hexadecimales a int. Luego, envía a char.

(Si hubiera implementado el lexer a mano, una alternativa sería realizar la conversión sobre la marcha ya que su lexer coincide con el literal Unicode. Pero al releer la pregunta, veo que está utilizando un generador lexer .. ¡buen movimiento!)

+1

Simplemente curioso: ¿cómo te das cuenta de que está usando un lexer? – BalusC

+1

@BalusC Debido a 'yytext', una variable específica lex –

+0

Correcto Pascal –

0

\uXXXX es una secuencia de escape. Antes de la ejecución, ya se convirtió en el valor real del carácter, no se evalúa de ninguna manera en el tiempo de ejecución.

Lo que probablemente quiera hacer es definir una asignación desde su sintaxis #XXXX a puntos de código Unicode y convertirlos al char.

2

Necesita convertir el punto de código particular a char. Usted puede hacer eso con un poco de ayuda de expresiones regulares:

String string = "blah #0061 blah"; 

Matcher matcher = Pattern.compile("\\#((?i)[0-9a-f]{4})").matcher(string); 
while (matcher.find()) { 
    int codepoint = Integer.valueOf(matcher.group(1), 16); 
    string = string.replaceAll(matcher.group(0), String.valueOf((char) codepoint)); 
} 

System.out.println(string); // blah a blah 

Editar de acuerdo con los comentarios, si se trata de una única manera, a continuación, sólo hacer:

String string = "0061"; 
char c = (char) Integer.parseInt(string, 16); 
System.out.println(c); // a 
+0

Erm ... usted no desea implementar un analizador léxico usando la coincidencia de patrón de expresiones regex de Java. –

+0

Punto válido, he actualizado la respuesta en consecuencia. – BalusC

+0

Necesito algo así como el primer ejemplo que publicaste. Ejecuté el código haciendo que el patrón cambie a medida que los necesito, pero ReplaceAll no reemplaza nada. La cadena es la misma que la cadena original :( –

2

Básicamente estoy tratando para convertir unicode a un carácter suministrando solo '0061' a un método, ayuda.

char fromUnicode(String codePoint) { 
    return (char) Integer.parseInt(codePoint, 16); 
} 

que necesita para manejar las malas entradas y tal, pero que va a funcionar de otra manera.