2010-01-18 4 views

Répondre

20

Il est plus facile que jamais, car il y a un paquet dans NuGet nommé Unicode Information

Avec cette , vous pouvez simplement appeler:

UnicodeInfo.GetName(character) 
+1

Génial. C'est la bonne réponse! A besoin de plus de votes upvotes – McKay

-4

Je pense que vous êtes à la recherche de l'objet Encoding.Unicode

+0

Cette classe ne fournira pas les données que le OP recherche ... –

4

Je ne pense pas qu'il y ait quoi que ce soit intégré dans .NET pour identifier ce ... Mais il y a une Unicode character database.

6

Il ne s'agit pas d'une fonctionnalité intégrée dans .NET. Vous pouvez trouver à partir de Charmap.exe, il affiche le nom du code dans la barre d'état. Si vous en avez besoin dans votre propre programme, vous pouvez compiler le Unicode Character Database dans votre application. Méfiez-vous des droits d'auteur. Comme NoBugz et MichaelBray ont dit .net Ne pas fournir de fonctionnalité intégrée pour obtenir le nom Unicode des caractères.

0

Et vous devez utiliser Unicode Base de données de caractères qui fournissent bUnicode.o à http://unicode.org/ucd aujourd'hui, il est contient des informations complètes sur toutes les 5.2 charcaters unicode informations (annexe n ° 44)

Une autre alternative est à des utilisations de fenêtres Carte caractère wicth Vous pouvez y accéder via Démarrer \ App Programmes \ Accessoires \ Outils système \ Carte de caractères (win + R => charmap)

Et aussi vous pouvez utiliser à partir de Unicode Converter Tools qui est un outil Open Source à http://unicode.codeplex.com il fournit également un Interface utilisateur pour obtenir des informations et aussi son utilisation de Unicode UCD (annexe # 44) la keynote de ce logiciel pour vous est que vous pouvez ajouter EnterPriseAppUnit dll de cette application à votre allication et utilisation de l'API fournie.

cette Assemblée containsome Méthode statique qui donne un char et renvoie le nom, HexCode, code décimal et etc

9

Voici une solution que vous pouvez mettre en œuvre immédiatement, comme copier/coller/compiler.

Tout d'abord, téléchargez la base de données Unicode (UCD) ici: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt

Ensuite, ajoutez ce code à votre projet pour lire l'UCD et de créer un dictionnaire pour rechercher le nom d'une valeur char .NET:

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); 
    } 
} 

Le fichier UnicodeData.txt est codé en UTF-8 et se compose d'une ligne d'informations pour chaque point de code Unicode. Chaque ligne contient une liste de champs séparés par des points-virgules, où le premier champ est le point de code Unicode en hexadécimal (sans préfixe) et le second champ est le nom du caractère. Vous trouverez des informations sur le fichier et les autres champs de chaque ligne ici: Informations sur le format de l'UCD peuvent être trouvés ici: http://www.unicode.org/reports/tr44/#Format_Conventions

Une fois que vous utilisez le code ci-dessus pour construire un mappage de caractères aux noms de caractères, vous il suffit de les récupérer à partir de la carte avec quelque chose comme ceci:

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"; 

Je suggère incorporer le fichier UnicodeData.txt dans vos ressources d'application, et en enroulant ce code dans une classe, qui charge et analyse le fichier une fois dans un initialiseur statique . Pour rendre le code plus lisible, vous pouvez implémenter une méthode d'extension dans cette classe de classe 'char' comme 'GetUnicodeName'. J'ai délibérément restreint les valeurs à la plage 0 à 0xFFFF, car tout ce qu'un char .NET UTF-16 peut contenir. .NET char ne représente pas réellement un vrai "caractère" (également appelé point de code), mais plutôt une unité de code Unicode UTF-16, puisque certains "caractères" nécessitent en réalité deux unités de code. Une telle paire d'unités de code est appelée un substitut haut et bas. Les valeurs supérieures à 0xFFFF (la plus grande valeur qu'un char de 16 bits peut stocker) sont en dehors du plan multilingue de base (BMP) et, selon l'encodage UTF-16, deux char s doivent être codées. Les codes individuels qui font partie d'une paire de substitution se retrouveront avec des noms tels que «Privé à usage privé, substitut élevé», «Privé à usage privé élevé» et «Faible substitution» avec cette implémentation.

7

Si vous utilisez Process Monitor pour voir les fichiers auxquels vous avez accédé par charmap.exe, vous verrez qu'il ouvre un fichier nommé C:\Windows\system32\getuname.dll. Ce fichier contient les noms de caractères dans ses ressources (en fait les ressources elles-mêmes sont dans un fichier .mui dans un sous-répertoire spécifique à la culture).

Tout ce que vous avez à faire est d'obtenir les noms de ce fichier, en utilisant l'API LoadString. J'ai écrit une classe d'aide pour le faire:

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 
    } 
} 

Vous pouvez l'utiliser comme ceci:

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 économiseur. – Jichao

+0

Très agréable (au moins si vous avez Windows à portée de main). Voir aussi http://www.pinvoke.net/default.aspx/getuname/GetUName.html – unbob

+0

L'avantage est qu'il est intégré à Windows (même sous XP). L'inconvénient est que les chaînes sont localisées et contiennent toutes les informations dans une chaîne. Au lieu de me donner les informations "nom" et "catégorie" séparément, il retourne tout dans une chaîne. Par exemple sur un Windows espagnol: "Letra latina mayúscula G con gancho". Pour cela, je préfère la réponse acceptée de Rik Hemsley. Sa bibliothèque donne beaucoup plus d'informations. – Elmue

Questions connexes