2010-01-18 19 views

Respuesta

20

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

Con esta , puede llamar al:

UnicodeInfo.GetName(character) 
+1

Impresionante. ¡Esta es la respuesta correcta! Necesita más votos positivos – McKay

-4

creo que busca el objeto Encoding.Unicode

+0

Esa clase no proporcionará los datos que el OP está buscando ... –

6

No es una función incorporada en .NET. Puede averiguarlo desde Charmap.exe, muestra el nombre del punto de código en la barra de estado. Si necesita eso en su propio programa, puede compilar el Unicode Character Database en su aplicación. Cuidado con los derechos de autor.

0

Como NoBugz y MichaelBray dijeron .net No proporciona ninguna función incorporada para obtener el nombre Unicode de los caracteres.

y usted tiene que utilizar la base de datos de caracteres de Unicode que proporcionan bUnicode.o en http://unicode.org/ucd hoy en día es contener la información completa de todos Unicode 5.2 charcaters información (anexo nº 44)

Otra alternativa es la de usos de las ventanas de mapa de caracteres wicth Puede acceder a ella a través de Inicio \ Programas de aplicaciones \ Accesorios \ Herramientas del sistema \ Mapa de caracteres (win + R => mapa de caracteres)

Y también puede usar las herramientas del convertidor Unicode que es una herramienta de código abierto en http://unicode.codeplex.com que también proporciona un Interfaz de usuario para obtener información y también su uso de Unicode UCD (anexo # 44) la nota clave de este software para usted es que usted puede agregar el EnterPriseAppUnit dll de esta aplicación a su allicación y uso de API proporcionada.

esta Asamblea containsome método estático que da un Char y volver Nombre, HexCode, Código decimal y etc

9

Aquí hay una solución se puede implementar de inmediato, como copiar/pegar/compilar.

En primer lugar, descargar la base de datos Unicode (UCD) aquí: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt

A continuación, añadir el código a su proyecto para leer la UCD y crear un diccionario para buscar el nombre de un valor .NET Char:

string[] unicodedata = File.ReadAllLines("UnicodeData.txt", Encoding.UTF8); 
Dictionary<char,string> charname_map = new Dictionary<char,string>(65536); 
for (int i = 0; i < unicodedata.Length; i++) 
{ 
    string[] fields = unicodedata[i].Split(';'); 
    int char_code = int.Parse(fields[0], NumberStyles.HexNumber); 
    string char_name = fields[1]; 
    if (char_code >= 0 && char_code <= 0xFFFF) //UTF-16 BMP code points only 
    { 
     bool is_range = char_name.EndsWith(", First>"); 
     if (is_range) //add all characters within a specified range 
     { 
      char_name = char_name.Replace(", First", String.Empty); //remove range indicator from name 
      fields = unicodedata[++i].Split(';'); 
      int end_char_code = int.Parse(fields[0], NumberStyles.HexNumber); 
      if (!fields[1].EndsWith(", Last>")) 
       throw new Exception("Expected end-of-range indicator."); 
      for (int code_in_range = char_code; code_in_range <= end_char_code; code_in_range++) 
       charname_map.Add((char)code_in_range, char_name); 
     } 
     else 
      charname_map.Add((char)char_code, char_name); 
    } 
} 

El archivo UnicodeData.txt está codificado en UTF-8 y consta de una línea de información para cada punto de código Unicode. Cada línea contiene una lista de campos separados por punto y coma, donde el primer campo es el punto de código Unicode en hexadecimal (sin prefijos) y el segundo campo es el nombre del personaje. Puede encontrar información sobre el archivo y los otros campos que contiene cada línea aquí: Información sobre el formato del UCD se puede encontrar aquí: http://www.unicode.org/reports/tr44/#Format_Conventions

Una vez que utiliza el código anterior para crear una asignación de caracteres a nombres de caracteres, simplemente descargarlos desde el mapa con algo como esto:

char c = 'Â'; 
string character_name; 
if (!charname_map.TryGetValue(c, out character_name)) 
    character_name = "<Character Name Missing>"; //character not found in map 
//character_name should now contain "LATIN CAPITAL LETTER A WITH CIRCUMFLEX"; 

que sugieren incrustar el archivo UnicodeData.txt en sus recursos de la aplicación, y envolviendo este código en una clase, que carga y analiza el archivo una vez en un inicializador estático . Para hacer que el código sea más legible, podría implementar un método de extensión en esa clase 'char' como 'GetUnicodeName'. He restringido deliberadamente los valores al rango de 0 a 0xFFFF, porque eso es todo lo que puede contener un char .NET UTF-16. .NET char no representa un verdadero "carácter" (también llamado punto de código), sino más bien una unidad de código Unicode UTF-16, ya que algunos "caracteres" en realidad requieren dos unidades de código. Tal par de unidades de código se llaman sustituto alto y bajo. Los valores superiores a 0xFFFF (el valor más grande que puede almacenar un char de 16 bits) están fuera del plano multilingüe básico (BMP) y, de acuerdo con la codificación UTF-16, requieren dos char para codificar. Los códigos individuales que forman parte de un par suplente terminarán con nombres como "Subrogado de alto uso no privado", "Subrogado de alto uso privado" y "Subrogado bajo" con esta implementación.

7

Si usa Process Monitor para ver los archivos a los que se accede por charmap.exe, verá que abre un archivo llamado C:\Windows\system32\getuname.dll. Este archivo contiene los nombres de los caracteres en sus recursos (en realidad, los recursos están en un archivo .mui en un subdirectorio específico de la cultura).

Así que todo lo que tiene que hacer es obtener los nombres de este archivo, utilizando la API LoadString. Escribí una clase de ayuda para hacerlo:

public class Win32ResourceReader : IDisposable 
{ 
    private IntPtr _hModule; 

    public Win32ResourceReader(string filename) 
    { 
     _hModule = LoadLibraryEx(filename, IntPtr.Zero, LoadLibraryFlags.AsDataFile | LoadLibraryFlags.AsImageResource); 
     if (_hModule == IntPtr.Zero) 
      throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); 
    } 

    public string GetString(uint id) 
    { 
     var buffer = new StringBuilder(1024); 
     LoadString(_hModule, id, buffer, buffer.Capacity); 
     if (Marshal.GetLastWin32Error() != 0) 
      throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); 
     return buffer.ToString(); 
    } 

    ~Win32ResourceReader() 
    { 
     Dispose(false); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    public void Dispose(bool disposing) 
    { 
     if (_hModule != IntPtr.Zero) 
      FreeLibrary(_hModule); 
     _hModule = IntPtr.Zero; 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern bool FreeLibrary(IntPtr hModule); 

    [Flags] 
    enum LoadLibraryFlags : uint 
    { 
     AsDataFile = 0x00000002, 
     AsImageResource = 0x00000020 
    } 
} 

Usted puede utilizar de esta manera:

string path = @"C:\Windows\System32\getuname.dll"; 
using (var reader = new Win32ResourceReader(path)) 
{ 
    string name = reader.GetString(0xA9); 
    Console.WriteLine(name); // Copyright Sign 
} 
+0

lifetim e ahorrador – Jichao

+0

Muy agradable (al menos si tiene Windows a mano). Consulte también http://www.pinvoke.net/default.aspx/getuname/GetUName.html – unbob

+0

La ventaja es que está integrado en Windows (incluso en XP). La desventaja es que las cadenas están localizadas y contienen toda la información en una cadena. En lugar de darme la información "nombre" y "categoría" por separado, devuelve todo en una cadena. Por ejemplo en un Windows en español: "Letra latina mayúscula G con gancho". Por eso prefiero la respuesta aceptada de Rik Hemsley. Su biblioteca brinda mucha más información. – Elmue

Cuestiones relacionadas