यूनिकोड वर्णों की तुलना कैसे करें कि "एक जैसे दिखें"?


94

मैं एक आश्चर्यजनक मुद्दे पर आता हूं।

मैंने अपने आवेदन में एक पाठ फ़ाइल लोड की है और मेरे पास कुछ तर्क हैं जो मूल्य की तुलना in से करते हैं।

और मुझे एहसास हुआ कि भले ही ग्रंथ समान हो, तुलनात्मक मूल्य गलत है।

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

बाद की पंक्ति में वर्ण µ कॉपी पेस्ट किया जाता है।

हालाँकि, ये केवल ऐसे पात्र नहीं हो सकते हैं जो इस तरह हैं।

क्या वर्णों की तुलना करने के लिए C # में कोई तरीका है जो समान दिखते हैं लेकिन वास्तव में अलग हैं?


158
लगता है कि आपको श्रोडिंगर की म्यू मिल गई है।
BoltClock

19
वे अलग-अलग वर्ण हैं - भले ही वे एक जैसे दिखते हों, उनके अलग-अलग वर्ण कोड हैं।
user2864740

93
यूनिकोड में आपका स्वागत है।
ta.speot.is

11
आपकी क्या प्राप्त करने की इच्छा है? उन दोनों को समान होना चाहिए फिर भी उनका वर्ण कोड अलग है लेकिन समान चेहरा है?
जेड

28
"एक जैसे दिखना" और "एक जैसी दिखना" अस्पष्ट अवधारणाएँ हैं। क्या उनका मतलब ग्लिफ़ की पहचान है, या सिर्फ समानता है? कितना करीब? ध्यान दें कि दो वर्णों में कुछ फ़ॉन्ट में समान ग्लिफ़ हो सकते हैं, दूसरे में बहुत समान और अभी तक किसी अन्य फ़ॉन्ट में काफी भिन्न। जो मायने रखता है वह यह है कि आप इस तरह की तुलना और किस संदर्भ में करेंगे (और गलत सकारात्मक और गलत नकारात्मक की स्वीकार्यता)।
जुक्का के। कोर्पेला

जवाबों:


125

कई मामलों में, आप कर सकते हैं सामान्य उनकी तुलना करने से पहले एक निश्चित सामान्य फार्म के लिए यूनिकोड वर्ण के दोनों है, और वे मैच के लिए सक्षम होना चाहिए। बेशक, आपको किस सामान्यीकरण फॉर्म का उपयोग करने की आवश्यकता है, यह स्वयं पात्रों पर निर्भर करता है; सिर्फ इसलिए कि वे एक जैसे दिखते हैं, जरूरी नहीं कि वे एक ही चरित्र का प्रतिनिधित्व करते हों। आपको यह भी विचार करने की आवश्यकता है कि क्या यह आपके उपयोग के मामले के लिए उपयुक्त है - जुक्का के। कोरेपला की टिप्पणी देखें।

इस विशेष स्थिति के लिए, यदि आप टोनी के उत्तर में लिंक का उल्लेख करते हैं, तो आप देखेंगे कि U + 00B5 के लिए तालिका कहती है:

अपघटन </ strong> कॉम्पिटिटर> GREEK SMALL LETTER MU (U + 03BC)

इसका अर्थ है U + 00B5, आपकी मूल तुलना का दूसरा वर्ण, U + 03BC, जो पहले वर्ण है, से विघटित हो सकता है।

तो आप केसी या केडी के सामान्यीकरण रूपों के साथ पूर्ण संगतता अपघटन का उपयोग करके वर्णों को सामान्य करेंगे। यहाँ एक त्वरित उदाहरण है जिसे मैंने प्रदर्शित करने के लिए लिखा है:

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

यूनिकोड के सामान्यीकरण और विभिन्न सामान्यीकरण रूपों के विवरण के लिए System.Text.NormalizationFormऔर यूनिकोड युक्ति का उल्लेख है ।


26
यूनिकोड कल्पना लिंक के लिए धन्यवाद। पहली बार मैंने कभी इस पर पढ़ा। इससे छोटा नोट: "सामान्यीकरण फॉर्म केसी और केडी को मनमाने ढंग से पाठ पर लागू नहीं किया जाना चाहिए .. इन सामान्यीकरण प्रपत्रों को अपरकेस या लोअरकेस मैपिंग की तरह समझना सबसे अच्छा है: मुख्य अर्थों की पहचान करने के लिए कुछ संदर्भों में उपयोगी है, लेकिन यह भी प्रदर्शन कर रहा है पाठ में संशोधन जो हमेशा उचित नहीं हो सकता है। "
user2864740

149

क्योंकि यह वास्तव में अलग-अलग प्रतीक हैं यहां तक ​​कि वे समान दिखते हैं, पहला वास्तविक अक्षर है और चार है code = 956 (0x3BC)और दूसरा सूक्ष्म चिन्ह है और है 181 (0xB5)

संदर्भ:

इसलिए यदि आप उनकी तुलना करना चाहते हैं और आपको उनके बराबर होने की आवश्यकता है, तो आपको इसे मैन्युअल रूप से संभालना होगा, या तुलना करने से पहले एक चार को दूसरे के साथ बदलना होगा। या निम्नलिखित कोड का उपयोग करें:

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

और डेमो


11
जिज्ञासा से बाहर, दो ios प्रतीकों के होने का क्या कारण है? आपको "Kilo sign" (या क्या आप?) नाम के साथ एक समर्पित K नहीं दिखता है।
मार्टिनहाट

12
@MartinHaTh: विकिपीडिया के अनुसार, यह "ऐतिहासिक कारणों से" है
BoltClock

12
उन चरित्र सेटों से रूपांतरण को आसान बनाने के लिए यूनिकोड में पुराने चरित्र सेट (जैसे आईएसओ 8859-1 ) से बहुत अधिक अनुकूलता वाले पात्र हैं । जब चरित्र सेट 8 बिट्स के लिए विवश थे, तो वे सबसे आम गणित और वैज्ञानिक उपयोगों के लिए कुछ ग्लिफ़ (जैसे कुछ ग्रीक अक्षर) शामिल करेंगे। उपस्थिति के आधार पर ग्लिफ़ का पुन: उपयोग आम था, इसलिए कोई विशेष 'के' नहीं जोड़ा गया था। लेकिन यह हमेशा एक समाधान था; "माइक्रो" के लिए सही प्रतीक वास्तविक ग्रीक लोअरकेस म्यू है, ओम के लिए सही प्रतीक वास्तविक पूंजी ओमेगा है, और इसी तरह।
वीजीआर


11
क्या अनाज के लिए एक विशेष कश्मीर है?

86

इन दोनों के अलग-अलग वर्ण कोड हैं: अधिक जानकारी के लिए इसे देखें

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

जहां, पहले एक है:

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

छवि


39

μ(म्यू) और µ(माइक्रो साइन) के विशिष्ट उदाहरण के लिए , बाद वाले के पास पूर्व के लिए संगतता अपघटन है, इसलिए आप माइक्रो संकेतों को मांस में बदलने के लिए स्ट्रिंग को सामान्य कर सकते हैं FormKCया कर सकते हैं FormKD

हालाँकि, ऐसे बहुत से वर्ण हैं, जो एक जैसे दिखते हैं, लेकिन किसी भी यूनिकोड के सामान्यीकरण फॉर्म के तहत समतुल्य नहीं हैं। उदाहरण के लिए, A(लैटिन), Α(ग्रीक) और А(सिरिलिक)। यूनिकोड वेबसाइट के पास इनकी एक सूची के साथ एक confusables.txt फ़ाइल है, जिसका उद्देश्य डेवलपर्स को होमोग्राफ हमलों के खिलाफ मदद करना है । यदि आवश्यक हो, तो आप इस फ़ाइल को पार्स कर सकते हैं और स्ट्रिंग्स के "दृश्य सामान्यीकरण" के लिए एक तालिका बना सकते हैं।


सामान्यीकृत का उपयोग करते समय निश्चित रूप से अच्छा है। यह आश्चर्यजनक लगता है कि वे अलग रहते हैं।
user2864740

4
@ user2864740: यदि एक अपरकेस ग्रीक ताऊ रोमन अक्षर T से अलग नहीं रहता है, तो ग्रीक और रोमन पाठ को समझदारी से अल्फ़ाबेटिक क्रम में रखना बहुत मुश्किल होगा। इसके अलावा, अगर एक टाइपफेस ग्रीक और रोमन अक्षरों के लिए एक अलग दृश्य शैली का उपयोग करने के लिए था, तो यह बहुत विचलित करने वाला होगा यदि ग्रीक अक्षर जिनके आकार रोमन अक्षरों से मिलते-जुलते थे, उन्हें अलग-अलग तरीके से प्रस्तुत किया गया था जो नहीं किया था।
सुपरकैट

7
इससे भी महत्वपूर्ण बात, यूरोपीय अक्षर एकीकृत होगा ToUpper/ ToLowerलागू करना मुश्किल। आपको अंग्रेजी में लेकिन ग्रीक में और रूसी में "B".ToLower()होना चाहिए । जैसा कि यह है, केवल तुर्की (डॉटलेस ) और कुछ अन्य भाषाओं को डिफ़ॉल्ट से अलग आवरण नियमों की आवश्यकता है। bβвi
dan04

@ dan04: मुझे आश्चर्य है कि अगर किसी ने कभी भी तुर्की के "मैं" और "आई" के सभी चार रूपों के लिए अद्वितीय कोड पॉइंट असाइन करने पर विचार किया है? यह टॉपर / टावलर के व्यवहार में किसी भी अस्पष्टता को समाप्त कर देता।
सुपरकैट

34

यूनिकोड डेटाबेस में दोनों वर्ण खोजें और अंतर देखें ।

एक है ग्रीक छोटा पत्र µ और दूसरा है माइक्रो साइन µ

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)

4
यह 37 उत्थान कैसे प्राप्त किया? यह सवाल का जवाब नहीं देता है ("यूनिकोड वर्णों की तुलना कैसे करें"), यह सिर्फ इस बात पर टिप्पणी करता है कि यह विशेष उदाहरण क्यों नहीं है। सबसे अच्छा, यह सवाल पर एक टिप्पणी होनी चाहिए। मैं समझता हूं कि टिप्पणी स्वरूपण विकल्प इसे अच्छी तरह से पोस्ट करने की अनुमति नहीं देते हैं क्योंकि उत्तर स्वरूपण विकल्प करते हैं, लेकिन उत्तर के रूप में पोस्ट करने के लिए एक वैध कारण नहीं होना चाहिए।
कोनरक

5
वास्तव में प्रश्न एक अलग था, यह पूछते हुए कि क्यों μ और check समानता की जांच झूठी है। यह उत्तर इसका उत्तर देता है। बाद में ओपी ने एक और सवाल (यह सवाल) पूछा कि एक जैसे दिखने वाले दो पात्रों की तुलना कैसे करें। दोनों प्रश्नों के सर्वश्रेष्ठ उत्तर थे और बाद में मॉडरेटर में से किसी एक ने दोनों प्रश्नों को मिला दिया और दूसरे के सर्वश्रेष्ठ उत्तर का चयन किया। किसी ने इस प्रश्न को संपादित किया, ताकि यह संक्षिप्त हो जाए
सुबीन जैकब

वास्तव में, मैं किसी भी सामग्री को मर्ज करने के बाद में नहीं जोड़ा था
Subin याकूब

24

EDIT C #
मूल उत्तर में 'μ' और 'in' की तुलना करने के तरीके के साथ इस प्रश्न के विलय के बाद :

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

संपादित टिप्पणियों को पढ़ने के बाद, हाँ यह अच्छा नहीं उपरोक्त विधि का उपयोग करने के क्योंकि यह, आदानों के कुछ अन्य प्रकार के लिए गलत परिणाम उपलब्ध करा सकता है के लिए यह हम का उपयोग करना चाहिए है सामान्य पूर्ण संगतता अपघटन में उल्लेख किया है के रूप में प्रयोग विकि । ( बोल्टकॉक द्वारा पोस्ट किए गए जवाब के लिए धन्यवाद )

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

उत्पादन

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
 ________________________________________________________________

Unicode_equivalence में जानकारी पढ़ते हुए मैंने पाया

तुल्यता मानदंड का चुनाव खोज परिणामों को प्रभावित कर सकता है। उदाहरण के लिए U + FB03 (,) जैसे कुछ टाइपोग्राफिक लिग्रेड्स, ..... इसलिए विकल्प के रूप में U + 0066 (f) के लिए खोज U + FB03 के NFKC सामान्यीकरण में सफल होगा, लेकिन U + FB03 के NFC सत्यापन में नहीं।

तो तुल्यता की तुलना करने के लिए हमें आम तौर पर FormKCNFKC के सामान्यीकरण या NFKD के सामान्यीकरण का उपयोग करना चाहिए FormKD
मैं सभी यूनिकोड वर्णों के बारे में अधिक जानने के लिए उत्सुक था, इसलिए मैंने नमूना बनाया जो सभी यूनिकोड वर्णों पर प्रसारित होगा UTF-16और मुझे कुछ परिणाम मिले जिनकी मैं चर्चा करना चाहता हूं

  • वर्ण जिसका के बारे में जानकारी FormCऔर FormDसामान्यीकृत मान बराबर नहीं थे
    Total: 12,118
    Character (int value): 192-197, 199-207, 209-214, 217-221, 224-253, ..... 44032-55203
  • वर्ण जिसका के बारे में जानकारी FormKCऔर FormKDसामान्यीकृत मान बराबर नहीं थे
    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
  • सभी चरित्र जिसका FormCऔर FormDसामान्यीकृत मान बराबर नहीं थे वहाँ, FormKCऔर FormKDसामान्यीकृत मान भी इन पात्रों को छोड़कर बराबर नहीं थे
    वर्ण:901 '΅', 8129 '῁', 8141 '῍', 8142 '῎', 8143 '῏', 8157 '῝', 8158 '῞'
    , 8159 '῟', 8173 '῭', 8174 '΅'
  • अतिरिक्त चरित्र जिनके FormKCऔर FormKDसामान्यीकृत मूल्य समतुल्य नहीं थे, लेकिन सामान्यीकृत मूल्य समान थे FormCऔर वर्ण:FormD
    Total: 119
    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'
  • कुछ पात्र ऐसे होते हैं जिन्हें सामान्यीकृत नहीं किया जा सकता है , ArgumentExceptionयदि उन्हें आजमाया जाता है
    Total:2081 Characters(int value): 55296-57343, 64976-65007, 65534

यह लिंक वास्तव में समझने में मददगार हो सकते हैं कि यूनिकोड तुल्यता के लिए कौन से नियम हैं

  1. Unicode_equivalence
  2. Unicode_compatibility_characters

4
अजीब लेकिन काम करता है ... मेरा मतलब है कि वे अलग-अलग अर्थों के साथ दो अलग-अलग वर्ण हैं और उन्हें ऊपरी में बदल देते हैं? मैं तर्क नहीं देखता, लेकिन अच्छा समाधान +1
बुडबोट

45
यह समाधान समस्या का सामना करता है, और एक सामान्य मामले में समस्या पैदा कर सकता है। इस तरह के परीक्षण से यह पता चलेगा "m".ToUpper().Equals("µ".ToUpper());और "M".ToUpper().Equals("µ".ToUpper());यह सच भी है। यह वांछनीय नहीं हो सकता है।
एंड्रयू लीच

6
-1 - यह एक भयानक विचार है। इस तरह से यूनिकोड के साथ काम न करें।
कोनराड रुडोल्फ

1
ToUpper () - आधारित ट्रिक्स के बजाय, String.Equals ("μ", "μ", StringComparison.CurrentCultureIgnoreCase) का उपयोग क्यों नहीं किया जाता है?
svenv

6
"माइक्रो साइन" और "GREEK SMALL LETTER MU" के बीच अंतर करने का एक अच्छा कारण है - यह कहना कि माइक्रो साइन का "अपरकेस" अभी भी माइक्रो साइन है। लेकिन पूंजीकरण माइक्रो को मेगा, खुश इंजीनियरिंग में बदलता है।
ग्रेग

9

सबसे अधिक संभावना है, दो अलग-अलग चरित्र कोड हैं जो एक ही चरित्र बनाते हैं (नेत्रहीन)। जबकि तकनीकी रूप से समान नहीं हैं, वे समान दिखते हैं। चरित्र तालिका पर एक नज़र डालें और देखें कि क्या उस चरित्र के कई उदाहरण हैं। या अपने कोड में दो वर्णों के वर्ण कोड का प्रिंट आउट लें।


6

आप पूछते हैं कि "उनकी तुलना कैसे करें" लेकिन आप हमें यह नहीं बताते कि आप क्या करना चाहते हैं।

उनकी तुलना करने के लिए कम से कम दो मुख्य तरीके हैं:

या तो आप उनकी तुलना सीधे तौर पर करते हैं जैसे आप हैं और वे अलग हैं

या आप यूनिकोड कम्पेटिबिलिटी नॉर्मलाइजेशन का उपयोग करते हैं यदि आपकी आवश्यकता एक तुलना के लिए है जो उन्हें मैच करने के लिए मिलती है।

हालांकि एक समस्या हो सकती है क्योंकि यूनिकोड संगतता सामान्यीकरण कई अन्य वर्णों की तुलना बराबर करेगा। यदि आप चाहते हैं कि केवल इन दो पात्रों को एक जैसा माना जाए तो आपको अपने सामान्यीकरण या तुलना कार्यों को रोल करना चाहिए।

अधिक विशिष्ट समाधान के लिए हमें आपकी विशिष्ट समस्या को जानना होगा। वह संदर्भ क्या है जिसके तहत आप इस समस्या को लेकर आए थे?


1
"माइक्रो साइन" और लोअरकेस म्यू चरित्र कैनोनिक रूप से समतुल्य हैं? विहित सामान्यीकरण का उपयोग करना आपको अधिक सख्त तुलना प्रदान करेगा।
टान्नर स्विट

@ TannerL.Swett: वास्तव में मुझे यह भी पता नहीं है कि मेरे सिर के ऊपर से कैसे चेक किया जाए ...
हिप्पिट्रैएल

1
दरअसल, मैं फिजिक्स फॉर्मूला वाली फाइल इंपोर्ट कर रहा था। आप सामान्यीकरण के बारे में सही हैं। मुझे इसके बारे में और गहराई से जाना है ..
डीजे

किस तरह की फाइल? किसी व्यक्ति द्वारा सादे यूनिकोड पाठ में कुछ हाथ से बनाया गया? या एक विशिष्ट प्रारूप में एक app द्वारा कुछ उत्पादन?
हिप्पिट्रैसिल

5

अगर मैं पांडित्यपूर्ण होना चाहूंगा, तो मैं कहूंगा कि आपके प्रश्न का कोई मतलब नहीं है, लेकिन जब से हम क्रिसमस आ रहे हैं और पक्षी गा रहे हैं, मैं इसके साथ आगे बढ़ूंगा।

सबसे पहले, जिन 2 संस्थाओं की आप तुलना करने की कोशिश कर रहे हैं glyph, वे हैं , एक ग्लिफ़, जो आमतौर पर एक "फ़ॉन्ट" के रूप में जाना जाता है, द्वारा प्रदान की जाने वाली ग्लिफ़ के सेट का एक हिस्सा है, वह चीज़ जो आमतौर पर एक में आती है ttf, otfया जो भी फ़ाइल स्वरूप आप हैं का उपयोग करते हुए।

ग्लिफ़ एक दिए गए प्रतीक का एक प्रतिनिधित्व है, और चूंकि वे एक प्रतिनिधित्व हैं जो एक विशिष्ट सेट पर निर्भर करते हैं, आप सिर्फ 2 समान या इससे भी बेहतर "समान" प्रतीकों की उम्मीद नहीं कर सकते हैं, यह एक वाक्यांश है जो समझ में नहीं आता है यदि आप संदर्भ पर विचार करते हैं, तो आपको कम से कम यह निर्दिष्ट करना चाहिए कि जब आप इस तरह का प्रश्न तैयार करते हैं तो आप किस ग्लिफ़ के फ़ॉन्ट या सेट पर विचार कर रहे हैं।

आमतौर पर जिस समस्या का आप सामना कर रहे हैं, उसके समान ही इसका उपयोग किया जाता है, यह एक OCR है, अनिवार्य रूप से एक सॉफ्टवेयर है जो ग्लिफ़ को पहचानता है और उसकी तुलना करता है, यदि C # एक OCR प्रदान करता है डिफ़ॉल्ट रूप से मुझे नहीं पता, लेकिन यह आमतौर पर एक बहुत बुरा है विचार करें कि क्या आपको वास्तव में ओसीआर की आवश्यकता नहीं है और आप जानते हैं कि इसके साथ क्या करना है।

आप संभवतः इस तथ्य का उल्लेख किए बिना एक भौतिक विज्ञान की पुस्तक को एक प्राचीन ग्रीक पुस्तक के रूप में व्याख्या कर सकते हैं, जो ओसीआर संसाधनों के संदर्भ में आम तौर पर महंगे हैं।

वहाँ एक कारण है कि उन पात्रों को जिस तरह से स्थानीयकृत किया जाता है, वैसा ही किया जाता है।


1

एक ही फ़ॉन्ट शैली और आकार के साथ दोनों वर्णों को खींचना संभव है DrawStringविधि के । प्रतीकों के साथ दो बिटमैप उत्पन्न होने के बाद, पिक्सेल द्वारा उनकी तुलना पिक्सेल से करना संभव है।

इस पद्धति का लाभ यह है कि आप न केवल पूर्ण समान वर्णकों की तुलना कर सकते हैं, बल्कि समान (निश्चित सहिष्णुता के साथ) भी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.