2009-09-03 20 views
14

अगर मैं निम्नलिखित बयान निष्पादित करें:स्ट्रिंग क्यों होता है। कॉम्पैयर उच्चारण अक्षरों को असंगत रूप से संभालता प्रतीत होता है?

string.Compare("mun", "mün", true, CultureInfo.InvariantCulture) 

परिणाम है '-1', यह दर्शाता है कि 'मुन' 'मुन' की तुलना में कम संख्यात्मक मान है।

हालांकि, अगर मैं इस कथन निष्पादित करें:

string.Compare("Muntelier, Schweiz", "München, Deutschland", true, CultureInfo.InvariantCulture) 

मैं '1', यह दर्शाता है कि 'Muntelier, Schewiz' पिछले जाना चाहिए।

क्या यह तुलना में एक बग है? या, अधिक संभावना है, वहाँ एक नियम मैं ध्यान में रखते हुए किया जाना चाहिए जब तार छँटाई युक्त उच्चारण


कारण यह कोई मुद्दा है, मैं एक सूची को क्रमबद्ध कर रहा हूँ और फिर कोई मैन्युअल द्विआधारी फिल्टर है कि मतलब है कर रही है 'xxx' से शुरू होने वाली प्रत्येक स्ट्रिंग प्राप्त करने के लिए।

पहले मैं लिंक 'कहां' विधि का उपयोग कर रहा था, लेकिन अब मुझे किसी अन्य व्यक्ति द्वारा लिखे गए इस कस्टम फ़ंक्शन का उपयोग करना है, क्योंकि वह कहता है कि यह बेहतर प्रदर्शन करता है।

लेकिन कस्टम फ़ंक्शन को ध्यान में नहीं आता है जो भी 'यूनिकोड' नियम .NET है। इसलिए यदि मैं इसे 'मुन' द्वारा फ़िल्टर करने के लिए कहता हूं, तो यह किसी भी आइटम को नहीं ढूंढता है, भले ही 'मुन' से शुरू होने वाली सूची में आइटम हों।

यह उच्चारण वर्णों के बाद कौन से पात्रों के आधार पर उच्चारण किए गए अक्षरों के असंगत क्रम के कारण प्रतीत होता है।


ठीक है, मुझे लगता है कि मैंने समस्या ठीक कर दी है।

फिल्टर से पहले, मैं एक तरह से प्रत्येक स्ट्रिंग, जहां n खोज स्ट्रिंग की लंबाई है की पहली n पत्र के आधार पर करते हैं।

+0

यह इस है कि मैं .नेट फ्रेमवर्क इच्छा की तरह क्षणों है तुलना की जाती है तो कर रहे हैं ओपन-सोर्स था, इसलिए मैं डीबग मोड में बस जा सकता था और यह पता लगा सकता था कि यह क्या कर रहा है। – Jonathan

+4

@ जोनाथनकॉवे: बेस क्लास लाइब्रेरी के स्रोत कोड के माध्यम से कदम उठाना संभव है, http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net- फ्रेमवर्क-स्रोत-कोड.aspx –

+0

@divo संदर्भ के लिए धन्यवाद। कभी नहीं पता था कि यह संभव था! – Jonathan

उत्तर

22

काम पर एक टाई तोड़ने एल्गोरिथ्म है, http://unicode.org/reports/tr10/

भाषा के प्रति संवेदनशील छंटाई की जटिलताओं को संबोधित करने के लिए देखते हैं, एक बहुस्तरीय तुलना एल्गोरिथ्म कार्यरत है। उदाहरण के लिए, दो शब्दों की तुलना में, सबसे महत्वपूर्ण विशेषता आधार चरित्र है: इस तरह के एक एक और एक बी एक्सेंट मतभेद के बीच अंतर के रूप में आम तौर पर , पर ध्यान नहीं दिया कि क्या आधार पत्र में कोई अंतर कर रहे हैं। केस अंतर (अपरकेस बनाम लोअरकेस), आमतौर पर अनदेखा किए जाते हैं, यदि आधार या उच्चारण में भिन्नताएं हैं। विराम चिह्न परिवर्तनीय है। कुछ स्थितियों में एक विराम चिह्न चरित्र आधार चरित्र की तरह व्यवहार किया जाता है। अन्य स्थितियों में, यदि कोई आधार, उच्चारण, या मामला अंतर है तो इसे पर अनदेखा किया जाना चाहिए। अंतिम, टाई-ब्रेकिंग स्तर भी हो सकता है, जिससे स्ट्रिंग में सभी पर कोई अन्य अंतर नहीं है, (सामान्यीकृत) कोड पॉइंट ऑर्डर का उपयोग किया जाता है।

तो, "मंट ..." और "म्यून ..." वर्णानुक्रम से अलग हैं और "टी" और "सी" के आधार पर क्रमबद्ध हैं।

जबकि, "मुन" और "मुन" वर्णानुक्रम ही ("यू" बराबर "ü" खो भाषाओं में करने के लिए) चरित्र कोड

6

ऐसा लगता है कि उच्चारण वर्ण का उपयोग केवल "टाई ब्रेक" स्थिति में किया जा रहा है - दूसरे शब्दों में, यदि तार अन्यथा बराबर हैं।

यहाँ प्रदर्शित करने के लिए कुछ नमूना कोड है: (। मैं के बाद "n" के साथ-साथ एक अंतरिक्ष जोड़ने की कोशिश की है, देखने के लिए अगर यह शब्द सीमाओं पर किया गया था - यह नहीं है)

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     Compare("mun", "mün"); 
     Compare("muna", "münb"); 
     Compare("munb", "müna"); 
    } 

    static void Compare(string x, string y) 
    { 
     int result = string.Compare(x, y, true, 
            CultureInfo.InvariantCulture)); 

     Console.WriteLine("{0}; {1}; {2}", x, y, result); 
    } 
} 

परिणाम:

mun; mün; -1 
muna; münb; -1 
munb; müna; 1 

मुझे लगता है यह विभिन्न जटिल यूनिकोड नियमों से सही है - लेकिन मैं उनके बारे में पर्याप्त जानकारी नहीं है।

इस बात के लिए कि आपको इसे ध्यान में रखना है या नहीं ... मुझे उम्मीद नहीं होगी। आप क्या कर रहे हैं जो इस से फेंक दिया जाता है?

4

जैसा कि मैं इसे समझता हूं यह अभी भी कुछ हद तक सुसंगत है। CultureInfo.InvariantCulture का उपयोग करते समय तुलना करें umlaut character ü गैर-उच्चारण वाले चरित्र u की तरह व्यवहार किया जाता है।

जैसा कि आपके पहले उदाहरण में स्ट्रिंग स्पष्ट रूप से बराबर नहीं हैं परिणाम 0 नहीं होंगे लेकिन -1 (जो एक डिफ़ॉल्ट मान प्रतीत होता है)। दूसरे उदाहरण में मंटेलियर अंतिम चला गया है क्योंकि टी वर्णमाला में सी का पालन करता है।

मैं इन नियमों समझा MSDN में कोई स्पष्ट प्रलेखन नहीं मिल सकता है, लेकिन मैंने पाया कि

string.Compare("mun", "mün", CultureInfo.InvariantCulture, 
    CompareOptions.StringSort); 

और

string.Compare("Muntelier, Schweiz", "München, Deutschland", 
    CultureInfo.InvariantCulture, CompareOptions.StringSort); 

वांछित परिणाम देता है।

वैसे भी, मुझे लगता है कि आप वर्तमान उपयोगकर्ता की संस्कृति (यदि संभव हो) जैसी विशिष्ट संस्कृति पर अपनी सॉर्टिंग के आधार पर बेहतर होंगे।

+0

'तुलनाऑप्शन। ऑर्डिनल' भी एक विकल्प हो सकता है। इस विकल्प के साथ तारों की तुलना यूनिकोड मानों के आधार पर की जाएगी। Http://msdn.microsoft.com/en-us/library/system.globalization.compareoptions.aspx देखें। –

संबंधित मुद्दे