Wie vergleiche ich Unicode-Zeichen, die „gleich aussehen“?

94

Ich falle in ein überraschendes Problem.

Ich habe eine Textdatei in meine Anwendung geladen und habe eine Logik, die den Wert mit µ vergleicht.

Und mir wurde klar, dass selbst wenn die Texte gleich sind, der Vergleichswert falsch ist.

 Console.WriteLine("μ".Equals("µ")); // returns false
 Console.WriteLine("µ".Equals("µ")); // return true

In der späteren Zeile wird das Zeichen µ kopiert und eingefügt.

Dies sind jedoch möglicherweise nicht die einzigen Zeichen, die so sind.

Gibt es in C # eine Möglichkeit, die Zeichen zu vergleichen, die gleich aussehen, aber tatsächlich unterschiedlich sind?

DJ
quelle
158
Sieht so aus, als hätten Sie Schrödingers Mu gefunden.
BoltClock
19
Sie sind verschiedene Zeichen - obwohl sie gleich aussehen, haben sie unterschiedliche Zeichencodes.
user2864740
93
Willkommen bei Unicode.
ta.speot.is
11
was willst du erreichen dass diese beiden gleich sein sollten, dann ist sogar ihr Zeichencode unterschiedlich, aber das gleiche Gesicht?
Jade
28
"Gleich aussehen" und "gleich aussehen" sind vage Konzepte. Bedeuten sie die Identität von Glyphen oder nur eine enge Ähnlichkeit? Wie knapp? Beachten Sie, dass zwei Zeichen in einigen Schriftarten identische Glyphen haben können, in einer anderen sehr ähnlich und in einer anderen Schriftart ziemlich unterschiedlich. Was zählt, ist, warum Sie einen solchen Vergleich durchführen würden und in welchem ​​Kontext (und die Akzeptanz von falsch positiven und falsch negativen Ergebnissen).
Jukka K. Korpela

Antworten:

125

In vielen Fällen können Sie normalisieren beide der Unicode - Zeichen auf eine gewisse Normalisierung Form vor ihnen zu vergleichen, und sie sollten übereinstimmen können. Welche Normalisierungsform Sie verwenden müssen, hängt natürlich von den Zeichen selbst ab. Nur weil sie gleich aussehen , heißt das nicht unbedingt, dass sie denselben Charakter repräsentieren. Sie müssen auch überlegen, ob es für Ihren Anwendungsfall geeignet ist - siehe den Kommentar von Jukka K. Korpela.

Wenn Sie sich in dieser speziellen Situation auf die Links in Tonys Antwort beziehen , sehen Sie, dass in der Tabelle für U + 00B5 Folgendes angegeben ist :

Zerlegung <Kompat> GRIECHISCHER KLEINBUCHSTABE MU (U + 03BC)

Dies bedeutet, dass U + 00B5, das zweite Zeichen in Ihrem ursprünglichen Vergleich, in U + 03BC, das erste Zeichen, zerlegt werden kann.

Sie normalisieren also die Zeichen mit vollständiger Kompatibilitätszerlegung mit den Normalisierungsformularen KC oder KD. Hier ist ein kurzes Beispiel, das ich geschrieben habe, um zu demonstrieren:

using System;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        char first = 'μ';
        char second = 'µ';

        // Technically you only need to normalize U+00B5 to obtain U+03BC, but
        // if you're unsure which character is which, you can safely normalize both
        string firstNormalized = first.ToString().Normalize(NormalizationForm.FormKD);
        string secondNormalized = second.ToString().Normalize(NormalizationForm.FormKD);

        Console.WriteLine(first.Equals(second));                     // False
        Console.WriteLine(firstNormalized.Equals(secondNormalized)); // True
    }
}

Einzelheiten zu Unicode - Normalisierung und die unterschiedlichen Normalisierungsformen beziehen sie auf System.Text.NormalizationFormund die Unicode - Spezifikation .

BoltClock
quelle
26
Vielen Dank für den Unicode-Spezifikationslink. Zum ersten Mal habe ich es gelesen. Kleine Anmerkung davon: "Normalisierungsformulare KC und KD dürfen nicht blind auf beliebigen Text angewendet werden. Es ist am besten, sich diese Normalisierungsformulare als Zuordnungen in Groß- oder Kleinbuchstaben vorzustellen: nützlich in bestimmten Kontexten, um Kernbedeutungen zu identifizieren, aber auch um zu funktionieren Änderungen am Text, die möglicherweise nicht immer angemessen sind. "
user2864740
149

Da es sich wirklich um verschiedene Symbole handelt, auch wenn sie gleich aussehen, ist der erste der eigentliche Buchstabe und hat code = 956 (0x3BC)Zeichen und der zweite ist das Mikrozeichen und hat 181 (0xB5).

Verweise:

Wenn Sie sie also vergleichen möchten und sie gleich sein müssen, müssen Sie sie manuell behandeln oder vor dem Vergleich ein Zeichen durch ein anderes ersetzen. Oder verwenden Sie den folgenden Code:

public void Main()
{
    var s1 = "μ";
    var s2 = "µ";

    Console.WriteLine(s1.Equals(s2));  // false
    Console.WriteLine(RemoveDiacritics(s1).Equals(RemoveDiacritics(s2))); // true 
}

static string RemoveDiacritics(string text) 
{
    var normalizedString = text.Normalize(NormalizationForm.FormKC);
    var stringBuilder = new StringBuilder();

    foreach (var c in normalizedString)
    {
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }

    return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}

Und die Demo

Tony
quelle
11
Was ist aus Neugier der Grund für zwei µ-Symbole? Sie sehen kein dediziertes K mit dem Namen "Kilo-Zeichen" (oder?).
MartinHaTh
12
@MartinHaTh: Laut Wikipedia ist es "aus historischen Gründen" .
BoltClock
12
Unicode enthält viele Kompatibilitätszeichen, die aus älteren Zeichensätzen (wie ISO 8859-1 ) übernommen wurden, um die Konvertierung aus diesen Zeichensätzen zu vereinfachen. Wenn Zeichensätze auf 8 Bit beschränkt waren, enthielten sie einige Glyphen (wie einige griechische Buchstaben) für die gängigsten mathematischen und wissenschaftlichen Zwecke. Die Wiederverwendung von Glyphen aufgrund des Aussehens war üblich, daher wurde kein spezielles "K" hinzugefügt. Aber es war immer eine Problemumgehung; Das richtige Symbol für "Mikro" ist der tatsächliche griechische Kleinbuchstabe mu, das richtige Symbol für Ohm ist das tatsächliche Großbuchstaben Omega und so weiter.
VGR
8
Nichts ist besser als wenn etwas für hysterische Rosinen getan wird
Paulm
11
Gibt es ein spezielles K für Getreide?
86

Beide haben unterschiedliche Zeichencodes: Weitere Informationen finden Sie hier

Console.WriteLine((int)'μ');  //956
Console.WriteLine((int)'µ');  //181

Wo, 1. ist:

Display     Friendly Code   Decimal Code    Hex Code    Description
====================================================================
μ           &mu;            &#956;          &#x3BC;     Lowercase Mu
µ           &micro;         &#181;          &#xB5;      micro sign Mu

Bild

Vishal Suthar
quelle
39

Für das spezifische Beispiel von μ(mu) und µ(Mikrozeichen) hat das letztere eine Kompatibilitätszerlegung mit dem ersteren, so dass Sie den String auf oder normalisieren könnenFormKCFormKD die Mikrozeichen in mus umwandeln können.

Es gibt jedoch viele Zeichensätze, die ähnlich aussehen, aber unter keinem Unicode-Normalisierungsformular gleichwertig sind. Zum Beispiel A(lateinisch), Α(griechisch) und А(kyrillisch). Die Unicode-Website enthält eine Datei confusables.txt mit einer Liste dieser Dateien, die Entwicklern helfen soll, sich vor Homograph-Angriffen zu schützen . Bei Bedarf können Sie diese Datei analysieren und eine Tabelle zur „visuellen Normalisierung“ von Zeichenfolgen erstellen.

dan04
quelle
Auf jeden Fall gut zu wissen, wenn Sie Normalisieren verwenden. Es scheint überraschend, dass sie unterschiedlich bleiben.
user2864740
4
@ user2864740: Wenn ein griechischer Tau in Großbuchstaben nicht von einem römischen Buchstaben T verschieden bleiben würde, wäre es sehr schwierig, griechischen und römischen Text sinnvoll in alphabetischer Reihenfolge zu sortieren. Wenn eine Schrift einen anderen visuellen Stil für griechische und römische Buchstaben verwenden würde, wäre es sehr ablenkend, wenn die griechischen Buchstaben, deren Formen römischen Buchstaben ähnelten, anders gerendert würden als diejenigen, die dies nicht taten.
Supercat
7
Machen was noch wichtiger ist , würde die europäischen Alphabete Vereinheitlichung ToUpper/ ToLowerschwierig umzusetzen. Sie müssen haben "B".ToLower()seine bin Englisch , aber βin der griechischen und вin russischer Sprache . Derzeit ibenötigen nur Türkisch (ohne Punkt ) und einige andere Sprachen andere als die Standardregeln für die Schreibweise.
Dan04
@ dan04: Ich frage mich, ob jemand jemals darüber nachgedacht hat, allen vier Variationen des türkischen "i" und "I" eindeutige Codepunkte zuzuweisen? Das hätte jegliche Unklarheit im Verhalten von toUpper / toLower beseitigt.
Supercat
34

Suchen Sie beide Zeichen in einer Unicode-Datenbank und sehen Sie den Unterschied .

Einer ist der griechische Kleinbuchstabe µ und der andere ist das Mikrozeichen µ .

Name            : MICRO SIGN
Block           : Latin-1 Supplement
Category        : Letter, Lowercase [Ll]
Combine         : 0
BIDI            : Left-to-Right [L]
Decomposition   : <compat> GREEK SMALL LETTER MU (U+03BC)
Mirror          : N
Index entries   : MICRO SIGN
Upper case      : U+039C
Title case      : U+039C
Version         : Unicode 1.1.0 (June, 1993)

Name            : GREEK SMALL LETTER MU
Block           : Greek and Coptic
Category        : Letter, Lowercase [Ll]
Combine         : 0
BIDI            : Left-to-Right [L]
Mirror          : N
Upper case      : U+039C
Title case      : U+039C
See Also        : micro sign U+00B5
Version         : Unicode 1.1.0 (June, 1993)
Subin Jacob
quelle
4
Wie kam es zu 37 positiven Stimmen? Es beantwortet nicht die Frage ("Wie man Unicode-Zeichen vergleicht"), sondern kommentiert nur, warum dieses spezielle Beispiel nicht gleich ist. Bestenfalls sollte es ein Kommentar zu der Frage sein. Ich verstehe, dass die Formatierungsoptionen für Kommentare es nicht erlauben, sie so gut zu veröffentlichen wie die Formatierungsoptionen für Antworten, aber das sollte kein gültiger Grund sein, sie als Antwort zu veröffentlichen.
Konerak
5
Tatsächlich war die Frage anders und fragte, warum die Gleichheitsprüfung μ und µ falsch ist. Diese Antwort beantwortet es. Später stellte OP eine weitere Frage (diese Frage), wie zwei Zeichen verglichen werden können, die sich ähneln. Beide Fragen hatten die besten Antworten und später führte einer der Moderatoren beide Fragen zusammen und wählte die beste Antwort der zweiten als beste aus. Jemand hat diese Frage so bearbeitet, dass sie zusammengefasst wird
Subin Jacob
Eigentlich habe ich nach dem Zusammenführen keinen Inhalt hinzugefügt
Subin Jacob
24

BEARBEITEN Nach dem Zusammenführen dieser Frage mit Wie man 'μ' und 'µ' in C # vergleicht
Originalantwort gepostet:

 "μ".ToUpper().Equals("µ".ToUpper()); //This always return true.

BEARBEITEN Nach dem Lesen der Kommentare ist es nicht gut, die obige Methode zu verwenden, da sie möglicherweise falsche Ergebnisse für eine andere Art von Eingaben liefert. Dazu sollten wir Normalisieren mit vollständiger Kompatibilitätszerlegung verwenden, wie im Wiki erwähnt . (Dank der Antwort von BoltClock )

    static string GREEK_SMALL_LETTER_MU = new String(new char[] { '\u03BC' });
    static string MICRO_SIGN = new String(new char[] { '\u00B5' });

    public static void Main()
    {
        string Mus = "µμ";
        string NormalizedString = null;
        int i = 0;
        do
        {
            string OriginalUnicodeString = Mus[i].ToString();
            if (OriginalUnicodeString.Equals(GREEK_SMALL_LETTER_MU))
                Console.WriteLine(" INFORMATIO ABOUT GREEK_SMALL_LETTER_MU");
            else if (OriginalUnicodeString.Equals(MICRO_SIGN))
                Console.WriteLine(" INFORMATIO ABOUT MICRO_SIGN");

            Console.WriteLine();
            ShowHexaDecimal(OriginalUnicodeString);                
            Console.WriteLine("Unicode character category " + CharUnicodeInfo.GetUnicodeCategory(Mus[i]));

            NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormC);
            Console.Write("Form C Normalized: ");
            ShowHexaDecimal(NormalizedString);               

            NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormD);
            Console.Write("Form D Normalized: ");
            ShowHexaDecimal(NormalizedString);               

            NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormKC);
            Console.Write("Form KC Normalized: ");
            ShowHexaDecimal(NormalizedString);                

            NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormKD);
            Console.Write("Form KD Normalized: ");
            ShowHexaDecimal(NormalizedString);                
            Console.WriteLine("_______________________________________________________________");
            i++;
        } while (i < 2);
        Console.ReadLine();
    }

    private static void ShowHexaDecimal(string UnicodeString)
    {
        Console.Write("Hexa-Decimal Characters of " + UnicodeString + "  are ");
        foreach (short x in UnicodeString.ToCharArray())
        {
            Console.Write("{0:X4} ", x);
        }
        Console.WriteLine();
    }

Ausgabe

INFORMATIO ABOUT MICRO_SIGN    
Hexa-Decimal Characters of µ  are 00B5
Unicode character category LowercaseLetter
Form C Normalized: Hexa-Decimal Characters of µ  are 00B5
Form D Normalized: Hexa-Decimal Characters of µ  are 00B5
Form KC Normalized: Hexa-Decimal Characters of µ  are 03BC
Form KD Normalized: Hexa-Decimal Characters of µ  are 03BC
 ________________________________________________________________
 INFORMATIO ABOUT GREEK_SMALL_LETTER_MU    
Hexa-Decimal Characters of µ  are 03BC
Unicode character category LowercaseLetter
Form C Normalized: Hexa-Decimal Characters of µ  are 03BC
Form D Normalized: Hexa-Decimal Characters of µ  are 03BC
Form KC Normalized: Hexa-Decimal Characters of µ  are 03BC
Form KD Normalized: Hexa-Decimal Characters of µ  are 03BC
 ________________________________________________________________

Beim Lesen von Informationen in Unicode_equivalence habe ich gefunden

Die Auswahl der Äquivalenzkriterien kann sich auf die Suchergebnisse auswirken. Zum Beispiel einig typografische Ligatur wie U + FB03 (ffi), ..... so eine Suche nach U + 0066 (f) als Teilkette würde gelingt in einer NFKC Normalisierung der U + FB03 aber nicht in NFC Normalisierung der U + FB03.

Um die Äquivalenz zu vergleichen, sollten wir normalerweise die FormKCNFKC-Normalisierung oder die FormKDNFKD-Normalisierung verwenden.
Ich war wenig neugierig, mehr über alle Unicode-Zeichen zu erfahren, also habe ich ein Beispiel erstellt, das über alle Unicode-Zeichen in iteriert, UTF-16und ich habe einige Ergebnisse erhalten, die ich diskutieren möchte

  • Informationen zu Zeichen, deren FormCund FormDnormalisierte Werte nicht äquivalent waren
    Total: 12,118
    Character (int value): 192-197, 199-207, 209-214, 217-221, 224-253, ..... 44032-55203
  • Informationen zu Zeichen, deren FormKCund FormKDnormalisierte Werte nicht äquivalent waren
    Total: 12,245
    Character (int value): 192-197, 199-207, 209-214, 217-221, 224-228, ..... 44032-55203, 64420-64421, 64432-64433, 64490-64507, 64512-64516, 64612-64617, 64663-64667, 64735-64736, 65153-65164, 65269-65274
  • Alle Zeichen, deren FormCund FormDnormalisierter Wert nicht äquivalent waren, FormKCund FormKDnormalisierte Werte waren ebenfalls nicht äquivalent, mit Ausnahme dieser Zeichen.
    Zeichen:901 '΅', 8129 '῁', 8141 '῍', 8142 '῎', 8143 '῏', 8157 '῝', 8158 '῞'
    , 8159 '῟', 8173 '῭', 8174 '΅'
  • Zusätzliches Zeichen, dessen FormKCund FormKDnormalisierter Wert nicht äquivalent waren, aber dort FormCund FormDnormalisierte Werte waren äquivalente
    Total: 119
    Zeichen:452 'DŽ' 453 'Dž' 454 'dž' 12814 '㈎' 12815 '㈏' 12816 '㈐' 12817 '㈑' 12818 '㈒' 12819 '㈓' 12820 '㈔' 12821 '㈕', 12822 '㈖' 12823 '㈗' 12824 '㈘' 12825 '㈙' 12826 '㈚' 12827 '㈛' 12828 '㈜' 12829 '㈝' 12830 '㈞' 12910 '㉮' 12911 '㉯' 12912 '㉰' 12913 '㉱' 12914 '㉲' 12915 '㉳' 12916 '㉴' 12917 '㉵' 12918 '㉶' 12919 '㉷' 12920 '㉸' 12921 '㉹' 12922 '㉺' 12923 '㉻' 12924 '㉼' 12925 '㉽' 12926 '㉾' 13056 '㌀' 13058 '㌂' 13060 '㌄' 13063 '㌇' 13070 '㌎' 13071 '㌏' 13072 '㌐' 13073 '㌑' 13075 '㌓' 13077 '㌕' 13080 '㌘' 13081 '㌙' 13082 '㌚' 13086 '㌞' 13089 '㌡' 13092 '㌤' 13093 '㌥' 13094 '㌦' 13099 '㌫' 13100 '㌬' 13101 '㌭' 13102 '㌮' 13103 '㌯' 13104 '㌰' 13105 '㌱' 13106 '㌲' 13108 '㌴' 13111 '㌷' 13112 '㌸' 13114 '㌺' 13115 '㌻' 13116 '㌼' 13117 '㌽' 13118 '㌾' 13120 '㍀' 13130 '㍊' 13131 '㍋' 13132 '㍌' 13134 '㍎' 13139 '㍓' 13140 '㍔' 13142 '㍖' .......... ﺋ' 65164 'ﺌ' 65269 'ﻵ' 65270 'ﻶ' 65271 'ﻷ' 65272 'ﻸ' 65273 'ﻹ' 65274'
  • Es gibt einige Charaktere, die nicht normalisiert werden können. Sie werfen, ArgumentExceptionwenn sie es versuchen
    Total:2081 Characters(int value): 55296-57343, 64976-65007, 65534

Diese Links können sehr hilfreich sein, um zu verstehen, welche Regeln für die Unicode-Äquivalenz gelten

  1. Unicode_Equivalenz
  2. Unicode_Kompatibilitätszeichen
dbw
quelle
4
Seltsam, aber funktioniert ... Ich meine, es sind zwei verschiedene Zeichen mit unterschiedlichen Bedeutungen, und wenn sie in obere umgewandelt werden, sind sie gleich? Ich sehe die Logik nicht, aber nette Lösung +1
BudBrot
45
Diese Lösung maskiert das Problem und kann im allgemeinen Fall Probleme verursachen. Diese Art von Test würde das finden "m".ToUpper().Equals("µ".ToUpper());und "M".ToUpper().Equals("µ".ToUpper());ist auch wahr. Dies ist möglicherweise nicht wünschenswert.
Andrew Leach
6
-1 - das ist eine schreckliche Idee. Arbeiten Sie nicht so mit Unicode.
Konrad Rudolph
1
Verwenden Sie anstelle von ToUpper () - basierten Tricks String.Equals ("μ", "μ", StringComparison.CurrentCultureIgnoreCase).
Svenv
6
Es gibt einen guten Grund, zwischen "MICRO SIGN" und "GREEK SMALL LETTER MU" zu unterscheiden - zu sagen, dass "Großbuchstaben" des Mikrozeichens immer noch ein Mikrozeichen sind. Aber die Kapitalisierung verwandelt Mikro in Mega, Happy Engineering.
Greg
9

Höchstwahrscheinlich gibt es zwei verschiedene Zeichencodes, die (sichtbar) dasselbe Zeichen bilden. Obwohl sie technisch nicht gleich sind, sehen sie gleich aus. Schauen Sie sich die Zeichentabelle an und prüfen Sie, ob es mehrere Instanzen dieses Zeichens gibt. Oder drucken Sie den Zeichencode der beiden Zeichen in Ihrem Code aus.

PMF
quelle
6

Sie fragen "wie man sie vergleicht", sagen uns aber nicht, was Sie tun möchten.

Es gibt mindestens zwei Möglichkeiten, sie zu vergleichen:

Entweder Sie vergleichen sie direkt so wie Sie sind und sie sind unterschiedlich

Oder Sie verwenden die Unicode-Kompatibilitätsnormalisierung, wenn Sie einen Vergleich benötigen, der übereinstimmt.

Es könnte jedoch ein Problem geben, da durch die Normalisierung der Unicode-Kompatibilität viele andere Zeichen gleich verglichen werden. Wenn Sie möchten, dass nur diese beiden Zeichen gleich behandelt werden, sollten Sie Ihre eigenen Normalisierungs- oder Vergleichsfunktionen ausführen.

Für eine spezifischere Lösung müssen wir Ihr spezifisches Problem kennen. In welchem ​​Kontext sind Sie auf dieses Problem gestoßen?

Hippietrail
quelle
1
Sind das "Mikrozeichen" und das Kleinbuchstaben mu kanonisch äquivalent? Die Verwendung der kanonischen Normalisierung würde Ihnen einen strengeren Vergleich ermöglichen.
Tanner Swett
@ TannerL.Swett: Eigentlich bin ich mir nicht mal sicher, wie ich das von oben überprüfen soll ...
Hippietrail
1
Eigentlich habe ich eine Datei mit Physikformel importiert. Sie haben Recht mit der Normalisierung. Ich muss es tiefer durchgehen ..
DJ
Was für eine Datei? Etwas, das von einer Person in einfachem Unicode-Text handgemacht wurde? Oder etwas, das von einer App in einem bestimmten Format ausgegeben wird?
Hippietrail
5

Wenn ich pedantisch sein möchte, würde ich sagen, dass Ihre Frage keinen Sinn ergibt, aber da wir uns Weihnachten nähern und die Vögel singen, werde ich damit fortfahren.

Zunächst einmal, die 2 Einheiten , die Sie vergleichen versuchen , sind glyphs, eine Glyphe Teil einer Reihe von Glyphen durch das, was vorgesehen ist , in der Regel wissen , als „font“, die Sache , die in der Regel in eine kommt ttf, otfoder was auch immer Dateiformat Sie sind mit.

Die Glyphen sind eine Darstellung eines bestimmten Symbols, und da es sich um eine Darstellung handelt, die von einer bestimmten Menge abhängt, können Sie nicht einfach zwei ähnliche oder sogar "bessere" identische Symbole erwarten. Diese Phrase ist nicht sinnvoll Wenn Sie den Kontext berücksichtigen, sollten Sie zumindest angeben, welche Schriftart oder welchen Satz von Glyphen Sie bei der Formulierung einer solchen Frage berücksichtigen.

Was normalerweise verwendet wird, um ein Problem zu lösen, das demjenigen ähnelt, auf das Sie stoßen, ist eine OCR, im Wesentlichen eine Software, die Glyphen erkennt und vergleicht, wenn C # eine OCR bereitstellt standardmäßig weiß ich das nicht, aber es ist im Allgemeinen eine wirklich schlechte Idee, wenn Sie keine OCR wirklich brauchen und wissen, was Sie damit machen sollen.

Möglicherweise interpretieren Sie ein Physikbuch als ein altes griechisches Buch, ohne die Tatsache zu erwähnen, dass OCR im Allgemeinen ressourcenintensiv sind.

Es gibt einen Grund, warum diese Zeichen so lokalisiert sind, wie sie lokalisiert sind. Tun Sie das einfach nicht.

user2485710
quelle
1

Mit der DrawStringMethode können beide Zeichen mit demselben Schriftstil und derselben Schriftgröße gezeichnet werden. Nachdem zwei Bitmaps mit Symbolen generiert wurden, können diese Pixel für Pixel verglichen werden.

Vorteil dieser Methode ist, dass Sie nicht nur absolut gleiche Zeichen vergleichen können, sondern auch ähnliche (mit definitiver Toleranz).

Ivan Kochurkin
quelle