tabelle Ermitteln des Unicode-Zeichen-Namens in.Net




unicode tabelle (6)

Hier ist eine Lösung, die Sie sofort implementieren können, wie Kopieren / Einfügen / Kompilieren.

Laden Sie zuerst die Unicode-Datenbank (UCD) hier herunter: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt

Fügen Sie als Nächstes diesen Code zu Ihrem Projekt hinzu, um die UCD zu lesen und ein Dictionary zum Nachschlagen des Namens eines .NET-Zeichenwerts zu erstellen:

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

Die Datei UnicodeData.txt ist UTF-8-codiert und besteht aus einer Zeile mit Informationen für jeden Unicode-Codepunkt. Jede Zeile enthält eine durch Semikolons getrennte Liste von Feldern, wobei das erste Feld der Unicode-Codepunkt in hexadezimaler Schreibweise (ohne Präfixe) und das zweite Feld der Charaktername ist. Informationen über die Datei und die anderen Felder, die jede Zeile enthält, finden Sie hier: Informationen zum Format der UCD finden Sie hier: http://www.unicode.org/reports/tr44/#Format_Conventions

Sobald Sie den obigen Code verwenden, um eine Zuordnung von Zeichen zu Charakternamen zu erstellen, rufen Sie sie einfach aus der Karte mit etwas in der Art:

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

Ich empfehle, die Datei UnicodeData.txt in Ihre Anwendungsressourcen einzubetten und diesen Code in eine Klasse einzufügen, die die Datei einmal in einem statischen Initialisierer lädt und analysiert. Um den Code lesbarer zu machen, könnten Sie eine Erweiterungsmethode in dieser Klassenklasse wie "GetUnicodeName" implementieren. Ich habe die Werte absichtlich auf den Bereich 0 bis 0xFFFF beschränkt, da dies alles ist, was ein .NET UTF-16-Zeichen halten kann. .NET char stellt eigentlich kein echtes "Zeichen" (auch Codepunkt genannt) dar, sondern eine Unicode-UTF-16-Code-Einheit, da einige "Zeichen" tatsächlich zwei Code-Einheiten benötigen. Ein solches Paar von Code-Einheiten wird als High- und Low-Surrogat bezeichnet. Werte über 0xFFFF (der größte Wert, den ein 16-Bit-Zeichen speichern kann) liegen außerhalb der Basic Multilingual Plane (BMP), und gemäß der UTF-16-Codierung müssen zwei char codiert werden. Einzelne Codes, die Teil eines Ersatzpaars sind, werden mit Namen wie "Nicht private Verwendung hoher Ersatz", "private Verwendung hohe Ersatz" und "niedrige Ersatz" mit dieser Implementierung enden.

Gibt es einen Weg in .Net herauszufinden, welcher Unicode-Name bestimmte Zeichen hat?

Wenn nicht, gibt es eine Bibliothek, die das kann?


Wie NoBugz und MichaelBray sagten .net Stellen Sie keine eingebaute Funktion zur Verfügung, um den Unicode-Namen von Zeichen zu erhalten.

Und Sie müssen von Unicode-Zeichendatenbank verwenden, die bUnicode.o unter http://unicode.org/ucd heute zur Verfügung stellen, es enthält vollständige Informationen aller unicode 5.2 charcaters Informationen (Anhang # 44)

Eine andere Alternative ist die Verwendung von Windows Character Map wicth. Sie können darauf zugreifen über Start \ Programme \ Zubehör \ System Tools \ Character Map (Win + R => Charmap)

Und Sie können auch von Unicode Converter Tools verwenden, die ein Open-Source-Tool unter http://unicode.codeplex.com es bietet auch eine Benutzeroberfläche zum Abrufen von Informationen und auch die Verwendung von Unicode-UCD (Anhang # 44) der Grundton von diesem Software für Sie ist, dass Sie die EnterPriseAppUnit dll dieser Anwendung zu Ihrer Allikation hinzufügen und von der bereitgestellten API verwenden können.

Diese Assembly enthält eine statische Methode, die einen Char - und Rückgabewert, HexCode, Dezimalcode und usw


Es ist jetzt einfacher als je zuvor, da es ein Paket in nugget namens Unicode Information gibt

Mit diesem können Sie einfach anrufen:

UnicodeInfo.GetName(character)

Es ist keine integrierte Funktion in .NET. Sie können aus Charmap.exe herausfinden, es zeigt den Codepoint-Namen in der Statusleiste an. Wenn Sie das in Ihrem eigenen Programm benötigen, können Sie die Unicode Character Database in Ihre App übersetzen. Vorsicht vor Urheberrechten.



Wenn Sie Process Monitor verwenden, um die Dateien charmap.exe , auf die von charmap.exe zugegriffen wird, sehen Sie, dass es eine Datei mit dem Namen C:\Windows\system32\getuname.dll . Diese Datei enthält die Charakternamen in ihren Ressourcen (tatsächlich befinden sich die Ressourcen selbst in einer .mui-Datei in einem kulturspezifischen Unterverzeichnis).

Alles, was Sie tun müssen, ist, die Namen aus dieser Datei mit der LoadString API zu ermitteln. Ich habe eine Hilfsklasse dafür geschrieben:

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

Du kannst es so benutzen:

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






unicode