2012-01-19 17 views
7

Estaba usando este vínculo más útiles: How do I check if a given string is a legal/valid file name under Windows?¿Cómo obtener un "nombre en inglés" para un personaje?

Y dentro de un cierto código de validación tengo algo que se parece a (ignorar el hecho de que no estoy usando una clase StringBuilder e ignorar el fallo en la formación del mensaje (Don 't necesidad de contarles sobre 'Colón' más de una vez si se muestra en la cadena más de una vez)):

string InvalidFileNameChars = new string(Path.GetInvalidFileNameChars()); 
Regex ContainsABadChar = new Regex("[" + Regex.Escape(InvalidFileNameChars) + "]"); 

MatchCollection BadChars = ContainsABadChar.Matches(txtFileName.Text); 
if (BadChars.Count > 0) 
{ 
    string Msg = "The following invalid characters were detected:\r\n\r\n"; 
    foreach (Match Bad in BadChars) 
    { 
     Msg += Bad.Value + "\r\n"; 
    } 
    MessageBox.Show(Msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    return; 
} 

ese cuadro de mensaje tendrá un aspecto similar (utilizando el ejemplo que se encuentra dos puntos):

- comenzar -

se detectan

Los siguientes caracteres no válidos:

:

- extremo -

Me gustaría que decir algo como:

- empezar -

Se detectaron los siguientes caracteres no válidos:

Colon ->:

- fin -

Me gusta tener el nombre en inglés. No es un asesino, pero tenía curiosidad por si hay alguna función como (que no existe para la clase Char, pero puede existir en alguna otra clase en la que no estoy pensando):

Char.GetEnglishName (': ');

+2

¿ha intentado escribir su propia función? –

+1

@ DanielA.White No estoy seguro de si quiere Unicode, pero son muchos los personajes. el Programa Charmap tiene esa información. – McKay

+2

:) Char.GetEnglishName (':'); Desearía que hubiera un método como este –

Respuesta

6

sólo puede utilizar el basic latin and controls unicode block si no es necesario dar cuenta de cada personaje, cada vez .

Puede definir la tabla como una simple matriz de cadenas para hacer búsquedas rápidas:

string[] lookup = new string[128]; 
lookup[0x00]="Null character"; 
lookup[0x01]="Start of Heading"; 
lookup[0x02]="Start of Text"; 
lookup[0x03]="End-of-text character"; 
lookup[0x04]="End-of-transmission character"; 
lookup[0x05]="Enquiry character"; 
lookup[0x06]="Acknowledge character"; 
lookup[0x07]="Bell character"; 
lookup[0x08]="Backspace"; 
lookup[0x09]="Horizontal tab"; 
lookup[0x0A]="Line feed"; 
lookup[0x0B]="Vertical tab"; 
lookup[0x0C]="Form feed"; 
lookup[0x0D]="Carriage return"; 
lookup[0x0E]="Shift Out"; 
lookup[0x0F]="Shift In"; 
lookup[0x10]="Data Link Escape"; 
lookup[0x11]="Device Control 1"; 
lookup[0x12]="Device Control 2"; 
lookup[0x13]="Device Control 3"; 
lookup[0x14]="Device Control 4"; 
lookup[0x15]="Negative-acknowledge character"; 
lookup[0x16]="Synchronous Idle"; 
lookup[0x17]="End of Transmission Block"; 
lookup[0x18]="Cancel character"; 
lookup[0x19]="End of Medium"; 
lookup[0x1A]="Substitute character"; 
lookup[0x1B]="Escape character"; 
lookup[0x1C]="File Separator"; 
lookup[0x1D]="Group Separator"; 
lookup[0x1E]="Record Separator"; 
lookup[0x1F]="Unit Separator"; 
lookup[0x20]="Space"; 
lookup[0x21]="Exclamation mark"; 
lookup[0x22]="Quotation mark"; 
lookup[0x23]="Number sign"; 
lookup[0x24]="Dollar sign"; 
lookup[0x25]="Percent sign"; 
lookup[0x26]="Ampersand"; 
lookup[0x27]="Apostrophe"; 
lookup[0x28]="Left parenthesis"; 
lookup[0x29]="Right parenthesis"; 
lookup[0x2A]="Asterisk"; 
lookup[0x2B]="Plus sign"; 
lookup[0x2C]="Comma"; 
lookup[0x2D]="Hyphen-minus"; 
lookup[0x2E]="Full stop"; 
lookup[0x2F]="Slash"; 
lookup[0x30]="Digit Zero"; 
lookup[0x31]="Digit One"; 
lookup[0x32]="Digit Two"; 
lookup[0x33]="Digit Three"; 
lookup[0x34]="Digit Four"; 
lookup[0x35]="Digit Five"; 
lookup[0x36]="Digit Six"; 
lookup[0x37]="Digit Seven"; 
lookup[0x38]="Digit Eight"; 
lookup[0x39]="Digit Nine"; 
lookup[0x3A]="Colon"; 
lookup[0x3B]="Semicolon"; 
lookup[0x3C]="Less-than sign"; 
lookup[0x3D]="Equal sign"; 
lookup[0x3E]="Greater-than sign"; 
lookup[0x3F]="Question mark"; 
lookup[0x40]="At sign"; 
lookup[0x41]="Latin Capital letter A"; 
lookup[0x42]="Latin Capital letter B"; 
lookup[0x43]="Latin Capital letter C"; 
lookup[0x44]="Latin Capital letter D"; 
lookup[0x45]="Latin Capital letter E"; 
lookup[0x46]="Latin Capital letter F"; 
lookup[0x47]="Latin Capital letter G"; 
lookup[0x48]="Latin Capital letter H"; 
lookup[0x49]="Latin Capital letter I"; 
lookup[0x4A]="Latin Capital letter J"; 
lookup[0x4B]="Latin Capital letter K"; 
lookup[0x4C]="Latin Capital letter L"; 
lookup[0x4D]="Latin Capital letter M"; 
lookup[0x4E]="Latin Capital letter N"; 
lookup[0x4F]="Latin Capital letter O"; 
lookup[0x50]="Latin Capital letter P"; 
lookup[0x51]="Latin Capital letter Q"; 
lookup[0x52]="Latin Capital letter R"; 
lookup[0x53]="Latin Capital letter S"; 
lookup[0x54]="Latin Capital letter T"; 
lookup[0x55]="Latin Capital letter U"; 
lookup[0x56]="Latin Capital letter V"; 
lookup[0x57]="Latin Capital letter W"; 
lookup[0x58]="Latin Capital letter X"; 
lookup[0x59]="Latin Capital letter Y"; 
lookup[0x5A]="Latin Capital letter Z"; 
lookup[0x5B]="Left Square Bracket"; 
lookup[0x5C]="Backslash"; 
lookup[0x5D]="Right Square Bracket"; 
lookup[0x5E]="Circumflex accent"; 
lookup[0x5F]="Low line"; 
lookup[0x60]="Grave accent"; 
lookup[0x61]="Latin Small Letter A"; 
lookup[0x62]="Latin Small Letter B"; 
lookup[0x63]="Latin Small Letter C"; 
lookup[0x64]="Latin Small Letter D"; 
lookup[0x65]="Latin Small Letter E"; 
lookup[0x66]="Latin Small Letter F"; 
lookup[0x67]="Latin Small Letter G"; 
lookup[0x68]="Latin Small Letter H"; 
lookup[0x69]="Latin Small Letter I"; 
lookup[0x6A]="Latin Small Letter J"; 
lookup[0x6B]="Latin Small Letter K"; 
lookup[0x6C]="Latin Small Letter L"; 
lookup[0x6D]="Latin Small Letter M"; 
lookup[0x6E]="Latin Small Letter N"; 
lookup[0x6F]="Latin Small Letter O"; 
lookup[0x70]="Latin Small Letter P"; 
lookup[0x71]="Latin Small Letter Q"; 
lookup[0x72]="Latin Small Letter R"; 
lookup[0x73]="Latin Small Letter S"; 
lookup[0x74]="Latin Small Letter T"; 
lookup[0x75]="Latin Small Letter U"; 
lookup[0x76]="Latin Small Letter V"; 
lookup[0x77]="Latin Small Letter W"; 
lookup[0x78]="Latin Small Letter X"; 
lookup[0x79]="Latin Small Letter Y"; 
lookup[0x7A]="Latin Small Letter Z"; 
lookup[0x7B]="Left Curly Bracket"; 
lookup[0x7C]="Vertical bar"; 
lookup[0x7D]="Right Curly Bracket"; 
lookup[0x7E]="Tilde"; 
lookup[0x7F]="Delete"; 

Entonces, todo lo que tiene que hacer es:

var englishName = lookup[(int)'~']; 

O:

public static string ToEnglishName(this char c) 
{ 
    int i = (int)c; 
    if(i < lookup.Length) 
     return lookup[i]; 
    return "Unknown"; 
} 

var name = ':'.ToEnglishName(); // Colon 
+0

Impresionante. Hasta ahora, todo se reduce a ti y plinth para la marca de verificación verde. Acabo de votar. – JustLooking

+0

Aunque el zócalo respondió primero, hizo un esfuerzo adicional (¡cortar y pegar!). Marca de verificación verde para usted! – JustLooking

4

El problema con el que se encontrará es que debe poder representar el espacio Unicode, que va a ser grande. Si realmente quieres hacer esto, la caída de los contenidos de this page en un diccionario a continuación, utilizar este método de extensión en carbón:

public static string ToName(this char c) 
{ 
    string result = ""; // or "unknown" or null or whatever 
    _charToName.TryGetValue(c, out result); 
    return result; 
} 

// ... 

string name = c.ToName(); 
+3

No hay ninguna razón para inicializar el resultado. TryGetValue lo configurará en nulo si no encuentra la clave. – Fantius

+0

Eeek! Tal vez solo agregue el 41 y si "TryGetValue" no arroja un resultado, obtendrán "Desconocido" como el nombre en inglés. :) – JustLooking

+0

Up-Vote. Gracias. Todavía estoy decidiendo sobre la marca de verificación verde. ¡Estás en la carrera! – JustLooking

1

Recopilé un diccionario de nombres de personajes que reuní de varias fuentes para una herramienta personal que hice para buscar a través de Unicode caracteres: http://jumpingfishes.com/unicodechars.htm

El diccionario se expresa como una matriz de JavaScript y contiene 20.761 definiciones. No dude en pedir mi JavaScript para crear un diccionario de C#:
http://jumpingfishes.com/unicodeDescriptions.js

Editar: Mejor aún, aquí está el archivo de texto que utilizan para generar mi JavaScript.Esta podría ser una fuente un poco más fácil de analizar para generar un diccionario C#. Contiene el código de carácter en hexadecimal seguido de una pestaña seguida de la descripción del personaje.
http://jumpingfishes.com/unicodeDictionary.txt

+0

Voto ascendente. Gracias por la entrada, es muy apreciada. – JustLooking

+0

su herramienta se beneficiaría de la búsqueda del decimal o hexadecimal del personaje. – JJS

+0

@jjs - Estoy de acuerdo. Podría haber jurado que tenía eso allí. – gilly3

1

como se menciona en la respuesta a esta pregunta Finding out Unicode character name in .Net por @ Rik-Hemsley

Es más fácil que nunca, ya que hay un paquete en Nuget llamado Unicode Information

Con esto, sólo puede llamar :

UnicodeInfo.GetName(character) 
+1

Esperaba que esto funcionara, pero la biblioteca no parece devolver nada más que NULL para los caracteres de control (por ejemplo, CR o ETX) –

Cuestiones relacionadas