2013-06-28 11 views
17

देता है यह प्रश्न C#, .NET कॉम्पैक्ट फ्रेमवर्क 2 और विंडोज सीई 5 डिवाइस पर लागू होता है।सी # string.IndexOf() अप्रत्याशित मान

मुझे एक .NET DLL में एक बग का सामना करना पड़ा जो कि कई अलग-अलग सीई उपकरणों पर उपयोग में था, बिना किसी समस्या के। अचानक, एक नए विंडोज सीई 5.0 डिवाइस पर, इस बग निम्नलिखित कोड में प्रकाशित हुई:

string s = "Print revenue receipt"; // has only single space chars 
int i = s.IndexOf(" "); // two space chars 

मैं मैं -1 होने की उम्मीद है, लेकिन इस से आज, जब indexOf अचानक वापस आ 5.

तक केवल सच था

जब

int i = s.IndexOf(" ", StringComparison.Ordinal); 

का उपयोग कर के बाद से इस व्यवहार नहीं होती है, मैं काफी यकीन है कि यह एक संस्कृति आधारित phenomenom है हूँ, लेकिन मैं अंतर इस नई डिवाइस बनाता है पहचान नहीं कर सकते। यह एक ज्ञात डिवाइस का एक समान संस्करण है (बस एक तेज सीपीयू और नया बोर्ड)।

दोनों ही उपकरण:

  • रन Windows CE 5.0 समान स्थानीयकरण के साथ
  • System.Environment.Version रिपोर्ट '2.0.7045.0'
  • CultureInfo.CurrentUICulture और CultureInfo.CurrentCulture रिपोर्ट 'en-GB' ('डी-डीई' के साथ भी परीक्षण किया गया)
  • 'सभी' संबंधित रजिस्ट्री कुंजियां बराबर हैं।

नए डिवाइस में सीएफ 3.5 प्रीइंस्टॉल किया गया था, जिनकी जीएसी फाइलों का मैंने प्रयोगात्मक रूप से नाम बदल दिया, वर्णित व्यवहार में कोई बदलाव नहीं हुआ। चूंकि रनटाइम पर हमेशा संस्करण 2.0.7045.0 की सूचना दी जाती है, मुझे लगता है कि इन असेंबली का कोई प्रभाव नहीं पड़ता है।

हालांकि यह ठीक करना मुश्किल नहीं है, जब चीजें जादुई लगती हैं तो मैं इसे खड़ा नहीं कर सकता। कोई संकेत जो मैं याद कर रहा था?

संपादित करें: screenshot

एक और:: screenshot

+0

आप इस _exact_ कोड को चलाते हैं, और आपको 5 मिलते हैं? –

+0

बिल्कुल बिल्कुल नहीं, ऊपर मेरा स्क्रीनशॉट देखें। मैंने सवाल भी सही किया। दिलचस्प अंक: * एस = "राजस्व प्रिंट करें"; // परिणाम -1 * एस = "ड्रुक बेलेग ऑस"; // परिणाम -1 (!) कृपया मेरे लगातार संपादन क्षमा करें, मैं SO के लिए नया हूं। –

+0

http://i.stack.imgur.com/iGxNb.png –

उत्तर

0

संस्कृति सामान वास्तव में कुछ सिस्टम पर काफी जादुई होने के लिए प्रकट हो सकते हैं यह अजनबी और अजनबी हो रही है, स्क्रीनशॉट देखें। दर्द के वर्षों के बाद मैं हमेशा क्या करता हूं हमेशा संस्कृति की जानकारी मैन्युअल रूप से InvariantCulture पर सेट करता है जहां मैं स्पष्ट रूप से विभिन्न संस्कृतियों के लिए अलग-अलग व्यवहार नहीं करना चाहता हूं। तो मेरी सुझाव होगा:

int i = s.IndexOf(" ", StringComparison.InvariantCulture); 
+0

मैंने यह भी कोशिश की, लेकिन वही व्यवहार दिखाई दिया। केवल स्ट्रिंग कॉम्पर्सन। ऑर्डिनल ने इसे ठीक किया। मुझे यह जानने की जरूरत है कि सप्ताहांत शुरू होने से पहले महत्वपूर्ण अंतर कहाँ छुपाया जाता है ;-) यह समझना बहुत मुश्किल लगता है, क्यों दो रिक्त स्थानों को एक के बराबर माना जा सकता है, जबकि 'स्ट्रिंग। एक्वाल्स ("", ""); ' (दो रिक्त स्थान बनाम एक स्थान) झूठी प्रतिक्रिया देता है ... –

+0

'स्ट्रिंग। एक्वाल्स 'सामान्य तुलना का उपयोग करता है; 'String.Compare (" "," ") 'इसके बजाए' कोशिश करें। – Mormegil

+0

स्ट्रिंग। कॉम्पैयर रिटर्न 1, इसलिए उन्हें बराबर के रूप में पहचाना नहीं जाता है। –

4

मेरा मानना ​​है कि आप पहले से ही एक क्रमसूचक खोज का उपयोग कर

int i = s.IndexOf(" ", StringComparison.Ordinal); 

आप एक छोटे पढ़ सकते हैं इस सवाल का जवाब है: सुनिश्चित करें कि IndexOf जांच हमेशा इतनी तरह एक ही संस्कृति की जानकारी का उपयोग,

ऐसे String.StartsWith और String.IndexOf के रूप में स्ट्रिंग खोज के तरीकों, भी कर सकते हैं: String Class जो इस विषय पर कहना चाहता है के लिए दस्तावेज में खंड संस्कृति-संवेदनशील या सामान्य स्ट्रिंग तुलना। निम्नलिखित उदाहरण इंडेक्सऑफ विधि का उपयोग करके क्रमिक और संस्कृति-संवेदनशील तुलनाओं के बीच अंतर को दर्शाता है।एक संस्कृति-संवेदनशील खोज जिसमें वर्तमान संस्कृति अंग्रेजी है (संयुक्त राज्य) लिगरेचर "œ" से मेल खाने के लिए "ओई" को प्रतिस्थापित करती है। चूंकि एक मुलायम हाइफ़न (यू + 00 एडी) शून्य-चौड़ाई वाला वर्ण होता है, इसलिए खोज नरम हाइफ़न को खाली के बराबर मानती है और स्ट्रिंग की शुरुआत में एक मैच पाती है। दूसरी ओर, एक औपचारिक खोज, किसी भी मामले में एक मैच नहीं मिलती है।

+2

मुझे पता है कि यह सवाल का सही जवाब है "मैं इसे कैसे ठीक करूं?" - लेकिन मेरा सवाल यह है: "यह क्यों हो रहा है?"। –

+0

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

+0

नहीं देख रहे हैं, यह समझा नहीं जा सकता कि यह अन्य सभी उपकरणों पर क्यों काम करता है। कम से कम वीएस डीबगर किसी भी छिपे हुए वर्ण प्रदान नहीं करता है जब एक हेक्स संपादक में कॉपी + चिपकाना। कृपया वर्णमाला पर लूप के साथ उदाहरण नोट करें। –

0

http://msdn.microsoft.com/en-us/library/k8b1470s.aspx राज्यों में संदर्भ:।

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

यह 4.5 संदर्भ से है, पिछले संस्करणों के संदर्भों में ऐसा कुछ भी नहीं है।

तो मुझे अनुमान लगाने दो: उन्होंने नियमों को 4.0 से 4.5 में बदल दिया है और अब दो अंतरिक्ष अनुक्रम की दूसरी जगह को "अज्ञानी चरित्र" माना जाता है - कम से कम यदि इंजन आपकी स्ट्रिंग को अंग्रेजी के रूप में पहचानता है पाठ (जैसे आपके उदाहरण स्ट्रिंग में), अन्यथा नहीं।

और किसी भी तरह से आपके नए डिवाइस पर, अपेक्षित 2.0 डीएल के बजाय 4.5 डीएल का उपयोग किया जाता है।

एक जंगली अनुमान, मुझे पता है :)

+0

एक बहुत जंगली अनुमान लेकिन उचित और शिक्षित। सिस्टम। पर्यावरण। संस्करण 2.0 दिखाता है।रनटाइम पर 7045.0, इसलिए सीएफ 2 एसपी 2 का उपयोग किया जाता है। इस सीएफ 2 स्थापना के अलावा, सीएफ 3.5 डीएलएल भी मौजूद हैं। –

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