2015-04-23 12 views
23

मैं सी # में पार्सिंग के साथ चारों ओर झुका रहा था और पाया कि मैंने कोशिश की हर स्ट्रिंग के लिए, string.StartsWith("\u2D2D") सच हो जाएगा। ऐसा क्यों है?स्ट्रिंग.StartsWith (" u2D2D") हमेशा सच क्यों होता है?

ऐसा लगता है कि यह हर चार के साथ काम करता है। इस कोड को .NET 4.5 के साथ आजमाया। डीबगर टूट नहीं गया।

for (char i = char.MinValue; i < char.MaxValue; i++) 
{ 
    if(!i.ToString().StartsWith("\u2d2d")) 
    { 
     Debugger.Break(); 
    } 
} 
+0

यहां एक गुच्छा की जांच करने के लिए कोड की एक पंक्ति है। मेरे लिए 'झूठा' देता है: 'संख्यात्मक। श्रेणी (0, 10000) .एनी (x =>! ((char) x)। टोस्टिंग()। प्रारंभ (" \ u2D2D ")) ' – DLeh

+0

[अजीब] (https: //ideone.com/q4kMsh)। [शायद संबंधित] (http://stackoverflow.com/questions/11467424/somestring-indexofsomestring-returns-1-instead-of-0-under-net-4/11467605#11467605)। – CodeCaster

+0

यह होना चाहिए क्योंकि सभी तार जॉर्जियाई हैं: डी – Alex

उत्तर

15

मुझे लगता है कि मुझे एक कोशिश होगी।

मुझे जो मिलता है, वह यह है कि यू + 2 डी 2 डी यूनिकोड v6.1 (source/source) में जोड़ा गया था।

संस्कृति के प्रति संवेदनशील छंटाई और आवरण स्ट्रिंग तुलना में इस्तेमाल नियम .NET फ्रेमवर्क के संस्करण पर निर्भर करते हैं:

.NET फ्रेमवर्क, या बल्कि देशी कॉल, एक कम संस्करण का समर्थन। विंडोज 8 ऑपरेटिंग सिस्टम पर चल रहे .NET फ्रेमवर्क 4.5 में, सॉर्टिंग, आवरण, सामान्यीकरण, और यूनिकोड वर्ण जानकारी यूनिकोड 6.0 मानक के अनुरूप है। अन्य ऑपरेटिंग सिस्टम पर, यह यूनिकोड 5.0 मानक के अनुरूप है। (source)

इस प्रकार इसे एक अज्ञानी चरित्र के रूप में चिह्नित करने की आवश्यकता है, जो व्यवहार करता है जैसे कि चरित्र भी वहां नहीं था।

वर्ण सेट से अनदेखा करने वर्ण, जो अक्षर हैं जो जब एक भाषाई या संस्कृति के प्रति संवेदनशील तुलना प्रदर्शन नहीं माना जाता हैं शामिल हैं। (source)

उदाहरण:

var culture = new CultureInfo("en-US"); 
int result = culture.CompareInfo.Compare("", "\u2D2D", CompareOptions.None); 
Assert.AreEqual(0, result); 

string.StartsWith एक ऐसी ही कार्यान्वयन का उपयोग करता है, लेकिन बजाय CompareInfo.IsPrefix(string, string, CompareOptions) उपयोग करता है।

+0

यह अन्य उत्तर, +1 से अधिक समझ में आता है। –

+0

मैंने अभी रिक्त स्ट्रिंग मान के साथ '.StartsWith()' का परीक्षण किया है, और यह सत्य इंगित करता है। अर्थात। '" abc ".StartsWith (" ")' सत्य * है। जो समझ में आता है, क्योंकि यह मूल रूप से कह रहा है कि अंतर्निहित स्ट्रिंग कम से कम एक * खाली स्ट्रिंग * से शुरू होती है। यह इंगित करेगा कि जब अंतर्निहित 'कर्नेल 32.dll' विधि' FindNLSStringEx' मानों को अमान्य मानता है, तो यह बस उन्हें स्ट्रिप्स करता है। (या कुछ अन्य, निचले स्तर की विधि करता है।) परिणाम चल रहा है 'स्ट्रिंग। स्टार्ट्सविथ ("")'। –

+0

@stakx: धन्यवाद, लेकिन अगर मैं नहीं करता तो मुझे कोई फर्क नहीं पड़ता। मैं बस सोच रहा था कि यह पहली जगह क्यों होगा, और शायद अगली बार मुझे इस तरह कुछ सामना करने में मदद मिलेगी। :) – Caramiriel

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