2011-07-03 22 views
8

Estoy tratando de hacer un programa C# que traduce el carácter unicode de su formato hexadecimal a un solo carácter, y tengo un problema. Este es mi código:Convertir hexadecimal carácter unicode en su representación visual

Esto funciona:

char e = Convert.ToChar("\u0066"); 

Sin embargo, esto no funciona:

Console.WriteLine("enter unicode format character (for example \\u0066)"); 
string s = Console.ReadLine(); 
Console.WriteLine("you entered (for example f)"); 
char c = Convert.ToChar(s); 

Debido (Convert.ToChar("\\u0066")) da el error:

String must be exactly one character long

Alguien tiene una idea de cómo hacer esto?

Respuesta

6

int.Parse no le gusta el "\ u" prefijo, pero si se valida primero para asegurarse de que está ahí, se puede utilizar

char c = (char)int.Parse(s.Substring(2), NumberStyles.HexNumber); 

Esto priva a los dos primeros caracteres de la cadena de entrada y analiza el texto restante.

Con el fin de garantizar que la secuencia es válida, intente esto:

Regex reg = new Regex(@"^\\u([0-9A-Fa-f]{4})$"); 
if(reg.IsMatch(s)) 
{ 
    char c = (char)int.Parse(s.Substring(2), NumberStyles.HexNumber); 
} 
else 
{ 
    // Error 
} 
+2

Eso tampoco es todo. Permitiría analizar '\ u a' y' \ u1234567890', ninguno de los cuales son constantes de carácter unicode válidas. –

+2

De hecho, de ahí la necesidad de validar el valor de entrada primero. –

+0

@Steve: ¡Sí! ¡¡Muchas gracias!! En realidad, validar los dos primeros caracteres será suficiente para mí, ya que si la secuencia comienza con \ u debe ser la secuencia hexadecimal adecuada, ya que capturo las secuencias incorrectas antes. Me salvaste el día :) – vldmrrdjcc

-1
Convert.ToChar("\u0066"); 

Esto es una cadena de un carácter en tiempo de ejecución, porque el compilador procesó la secuencia de barra invertida.

El resto de su código se trata de seis cadenas de caracteres { '\\', 'u', '0', '0', '6', '6' }, que Convert.ToChar no puede manejar.

Pruebe char.Parse (o posiblemente Int16.Parse(s, NumberStyles.AllowHexSpecifier) seguido de un molde en char).

+0

Ninguno de los trabajos, porque todavía char.parse sólo aceptará un único carácter y Int16.Parse no admite una especificador unicode. –

+0

@Steve: Bueno, necesita sacar los dígitos hexadecimales de la cadena usando una expresión regular o similar. –

Cuestiones relacionadas