2014-09-29 9 views
6

सी # का उपयोग करके, मैं एक .ascx पृष्ठ से TextBox.Text मान प्राप्त करता हूं। जब मैं LINQ-query के अंदर मान की समानता की नियमित स्ट्रिंग ऑब्जेक्ट की तुलना करता हूं, तो यह हमेशा झूठा होता है।सी # - विभिन्न एन्कोडिंग के तारों की तुलना

मैं इस निष्कर्ष पर आया हूं कि वे अलग-अलग एन्कोड किए गए हैं, लेकिन अब तक उन्हें बदलने या तुलना करने में कोई भाग्य नहीं है।

docname = "Testdoc 1.docx"; //regular string created in C# 
fetchedVal = ((TextBox)e.Item.FindControl("txtSelectedDocs")).Text; //UTF-8 

उपरोक्त दो तार समान जब शाब्दिक रूप में प्रतिनिधित्व है, लेकिन byte[] की तुलना में वे स्पष्ट रूप से एन्कोडिंग की वजह से अलग कर रहे हैं।

System.Text.Encoding.Default.GetString(utf8.GetBytes(fetchedVal)); 

लेकिन यह है कि मूल्य "Testdoc 1.docx" वापस आ जाएगी:

मैं जैसे अलग अलग बातें, की बहुत कोशिश की है।

अगर मैं बजाय

System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(fetchedVal)); 

यह रिटर्न "Testdoc 1.docx" लेकिन एक Equals() की जाँच करें अभी भी false रिटर्न का प्रयास करें।

मैं भी निम्नलिखित है, जो दृष्टिकोण की सिफारिश होने लगते हैं की कोशिश की है, लेकिन कोई भाग्य के साथ:

byte[] utf8Bytes = Encoding.UTF8.GetBytes(fetchedVal); 
byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); 
string fetchedValConverted = Encoding.Unicode.GetString(unicodeBytes); 

अपराधी, खाली स्थान के होने के लिए यह हमेशा सातवें बाइट है जब बाइट क्रम की जांच क्योंकि प्रकट होता है वह अलग है।

सी # में डिफ़ॉल्ट स्ट्रिंग एन्कोडिंग में आप यूटीएफ -8 से ठीक से कैसे परिवर्तित होते हैं?

+0

मुझे यकीन नहीं है कि यहां वास्तव में समस्या क्या है, लेकिन मैं आपको स्ट्रिंग के सामान्यीकृत फ़ंक्शन पर इंगित करना चाहता हूं। यह नहीं पता कि इससे आपकी समस्या ठीक हो जाएगी, लेकिन यह तुलना करने से पहले तारों को सामान्यीकृत करना आपके लिए उपयोगी हो सकता है। http://msdn.microsoft.com/en-us/library/system.string.normalize(v=vs.110).aspx –

+0

@SLaks के उत्तर को देखें, इसे एन्कोडिंग के साथ नहीं करना है। .NET के भीतर, सभी तार बराबर हैं, अर्थात् यूनिकोड यूटीएफ -16 में एन्कोड किया गया है। यहां अपराधी एक गैर-ब्रेकिंग स्पेस है, [  "के बजाय दिखाए गए [एचटीएमएल एन्कोडिंग मुद्दे -" वर्ण देखें (http://stackoverflow.com/questions/1461907/html-encoding-issues-%C3% 82-चरित्र-दिखा-अप-बजाय के- nbsp)। आपके टेक्स्टबॉक्स में यह टेक्स्ट कहां से चिपकाया गया है, और यह कैसे आउटपुट किया जाता है? – CodeCaster

+1

बस @ डेविड्स के जवाब के रूप में, मैंने बिना सफलता के 'सामान्यीकृत' समारोह की खोज की है। @ कोडकस्टर, 'TextBox.Text' JQuery से सेट है। मुझे इस तथ्य से चूक गया कि यह उसके कारण हो सकता है! –

उत्तर

6

स्ट्रिंग्स में एन्कोडिंग या बाइट एरे नहीं हैं। जब आप स्ट्रिंग को बाइट सरणी में परिवर्तित करते हैं तो एन्कोडिंग केवल तब खेलती है; आप बाइट्स चुनने के लिए उपयोग करने के लिए कौन सी एन्कोडिंग निर्दिष्ट कर सकते हैं केवल यह कर सकते हैं।

ऐसा लगता है कि वास्तव में आपके स्ट्रिंग में वास्तव में अलग-अलग वर्ण हैं। उनमें से एक में आपके पास एक अदृश्य चरित्र हो सकता है, या उनके पास अलग-अलग वर्ण हो सकते हैं जो समान दिखते हैं।

पता लगाने के लिए, प्रत्येक स्ट्रिंग में प्रत्येक वर्ण के यूनिकोड कोडपॉइंट मानों को देखें (उदाहरण के लिए, (int) str[0])।

+0

यह बहुत ही व्यावहारिक लगता है, मैं इसे सुबह में पहली चीज़ में देखूंगा! –

+0

यह समस्या थी। किसी भी तरह एक सफेद अंतरिक्ष चरित्र (' ', 'यू +0020') वास्तव में एक गैर-ब्रेकिंग स्पेस था (' ')। –

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