2015-01-15 6 views
5

क्यों .net (Windows 8) के तहत इस स्ट्रिंग तुलना सच वापसी करता है?क्यों स्ट्रिंग " u0022" इस तार के साथ शुरू होता है " u204D"

"\u0022".StartsWith("\u204D"); 

यह सभी संस्कृतियों के तहत सच है और यदि आप स्टार्ट्सविथ को बराबर पर स्विच करते हैं तो यह झूठा होता है।

कई अलग अलग अक्षर हैं जो एक StartsWith तुलना के लिए सच लौट रहे हैं। क्या यह एक विषम यूनिकोड नियम का हिस्सा है या क्या विंडोज़ के अपने नियम यहां हैं?

+0

एक यूनिकोड में सही चार के नाम को फिर से देखें तालिका। यूनिकोड तुलना सूक्ष्म हैं। उदाहरण के लिए कुछ वर्ण (उदा। शून्य-चौड़ाई (गैर) योजक या कुछ संशोधक) गुंबद तुलना में अनदेखा कर रहे हैं। – CodesInChaos

+0

यदि आप सरल नियम चाहते हैं, तो सामान्य तुलना का उपयोग करें। – CodesInChaos

+0

@CodesInChaos साधारण में स्थानांतरित करना चाहते हैं और मैं संभावित ब्रेकिंग परिवर्तनों के माध्यम से चल रहा हूं जब यह और कई अन्य लोग आए। – Zoom

उत्तर

0

यह पता है कि नियम संस्कृति पर निर्भर स्ट्रिंग तुलना के तहत झूठ आसान नहीं है। यह काफी सुसंगत प्रतीत होता है कि विराम चिह्न U + 0022 " (उद्धरण चिह्न) और U + 204D (काले दायां BULLET) माना जाता है "पर्याप्त बराबर" (अपरिवर्तनीय संस्कृति सहित) संस्कृति तुलना के तहत। इन उदाहरणों सभी संकेत मिलता है कि:

// culture-sensitive: 

Console.WriteLine("\"".StartsWith("⁍")); 
Console.WriteLine("⁍".StartsWith("\"")); 
Console.WriteLine("\"".StartsWith("⁍", StringComparison.InvariantCulture)); 
Console.WriteLine("⁍".StartsWith("\"", StringComparison.InvariantCulture)); 

Console.WriteLine("\"".Equals("⁍", StringComparison.CurrentCulture)); 
Console.WriteLine("⁍".Equals("\"", StringComparison.CurrentCulture)); 
Console.WriteLine("\"".Equals("⁍", StringComparison.InvariantCulture)); 
Console.WriteLine("⁍".Equals("\"", StringComparison.InvariantCulture)); 

Console.WriteLine(StringComparer.CurrentCulture.Equals("\"", "⁍")); 
Console.WriteLine(StringComparer.CurrentCulture.Equals("⁍", "\"")); 
Console.WriteLine(StringComparer.InvariantCulture.Equals("\"", "⁍")); 
Console.WriteLine(StringComparer.InvariantCulture.Equals("⁍", "\"")); 

Console.WriteLine("\"".CompareTo("⁍")); 
Console.WriteLine("⁍".CompareTo("\"")); 

Console.WriteLine(StringComparer.CurrentCulture.Compare("\"", "⁍")); 
Console.WriteLine(StringComparer.CurrentCulture.Compare("⁍", "\"")); 
Console.WriteLine(StringComparer.InvariantCulture.Compare("\"", "⁍")); 
Console.WriteLine(StringComparer.InvariantCulture.Compare("⁍", "\"")); 

अन्य उदाहरण string पर, यह देखते हुए किया जा सकता था, उदाहरण के लिए static तरीकों, पर वे बराबर हैं।

एक क्रमसूचक तुलना, निश्चित रूप से U + 0022 से (कम से कम) अलग होना चाहिए के साथ

U + 204D (कि आसान है!):

// ordinal: 

Console.WriteLine("\"".StartsWith("⁍", StringComparison.Ordinal)); 
Console.WriteLine("⁍".StartsWith("\"", StringComparison.Ordinal)); 

Console.WriteLine("\"".Equals("⁍")); 
Console.WriteLine("⁍".Equals("\"")); 

Console.WriteLine(StringComparer.Ordinal.Equals("\"", "⁍")); 
Console.WriteLine(StringComparer.Ordinal.Equals("⁍", "\"")); 

Console.WriteLine(StringComparer.Ordinal.Compare("\"", "⁍")); 
Console.WriteLine(StringComparer.Ordinal.Compare("⁍", "\"")); 
संबंधित मुद्दे