ठीक है, .Net और C # में सभी तार UTF-16LE के रूप में एन्कोड किए गए हैं । A stringको वर्णों के अनुक्रम के रूप में संग्रहीत किया जाता है। प्रत्येक char2 बाइट्स या 16 बिट्स के भंडारण को इनकैप्सुलेट करता है।
एक अक्षर, वर्ण, ग्लिफ़, प्रतीक, या विराम चिह्न के रूप में हम "कागज़ या स्क्रीन पर" जो देखते हैं, उसे एकल पाठ तत्व के रूप में सोचा जा सकता है। जैसा कि यूनिकोड मानक अनुलग्नक # 29 UNICODE TEXT SEGMENTATION में वर्णित है , प्रत्येक पाठ तत्व का प्रतिनिधित्व एक या अधिक कोड बिंदुओं द्वारा किया जाता है। कोड की एक विस्तृत सूची यहां पाई जा सकती है ।
प्रत्येक कोड प्वाइंट को कंप्यूटर द्वारा आंतरिक प्रतिनिधित्व के लिए बाइनरी में एन्कोड किया जाना चाहिए। जैसा कि कहा गया है, प्रत्येक char2 बाइट्स संग्रहीत करता है। या उससे नीचे के कोड पॉइंट्स को U+FFFFसिंगल में स्टोर किया जा सकता है char। ऊपर दिए गए कोड पॉइंट्स U+FFFFको एक सरोगेट जोड़ी के रूप में संग्रहीत किया जाता है, जो सिंगल कोड पॉइंट का प्रतिनिधित्व करने के लिए दो चार्ट का उपयोग करता है।
यह देखते हुए कि अब हम जानते हैं कि हम कटौती कर सकते हैं, एक पाठ तत्व charको दो वर्णों के सरोगेट जोड़ी के रूप में एक के रूप में संग्रहीत किया जा सकता है , या यदि पाठ तत्व का प्रतिनिधित्व कई कोड बिंदुओं द्वारा किया जाता है तो कुछ वर्णों और सरोगेट जोड़े के कुछ संयोजन। जैसे कि वे पर्याप्त जटिल नहीं थे, कुछ पाठ तत्वों को कोड पॉइंट्स के विभिन्न संयोजनों के रूप में वर्णित किया जा सकता है, जैसा कि यूनिकोड स्टैंडर्ड एनेक्स # 15, यूनीकोड नॉर्मलाइज़ेशन फॉर्म्स ।
अन्तराल
इसलिए, जब रेंडर किए गए समान दिखते हैं, तो वास्तव में वर्णों के एक अलग संयोजन से बना जा सकता है। इस तरह के दो तार की तुलना में एक ऑर्डिनल (बाइट द्वारा) अंतर का पता लगाता है, यह अप्रत्याशित या अवांछनीय हो सकता है।
आप .Net स्ट्रिंग्स को फिर से एनकोड कर सकते हैं। ताकि वे समान सामान्यीकरण फ़ॉर्म का उपयोग करें। एक बार सामान्य हो जाने पर, एक ही टेक्स्ट एलिमेंट्स के साथ दो स्ट्रिंग्स को एक ही तरह से इनकोड किया जाएगा। ऐसा करने के लिए, स्ट्रिंग का उपयोग करें। सामान्य कार्य करें। हालाँकि, याद रखें, कुछ अलग पाठ तत्व एक दूसरे के समान दिखते हैं। : -s
तो, सवाल के संबंध में इसका क्या मतलब है? टेक्स्ट एलिमेंट '𠈓'को सिंगल कोड पॉइंट U + 20213 cjk यूनिफाइड विचारधारा विस्तार b द्वारा दर्शाया गया है । इसका मतलब यह है कि इसे एक एकल के रूप में एन्कोड नहीं किया जा सकता है charऔर दो वर्णों का उपयोग करके सरोगेट जोड़ी के रूप में एन्कोड किया जाना चाहिए। यही कारण string bहै charकि अब एक है string a।
यदि आपको मज़बूती से (कैविएट देखें) गिनती करने की आवश्यकता है, तो आपको इस तरह stringसे System.Globalization.StringInfoक्लास एलिमेंट्स की संख्या का उपयोग करना चाहिए
।
using System.Globalization;
string a = "abc";
string b = "A𠈓C";
Console.WriteLine("Length a = {0}", new StringInfo(a).LengthInTextElements);
Console.WriteLine("Length b = {0}", new StringInfo(b).LengthInTextElements);
उत्पादन दे रहा है,
"Length a = 3"
"Length b = 3"
जैसा सोचा था।
चेतावनी
यूनिकोड टेक्स्ट सेगमेंटेशन का .Net कार्यान्वयन इन StringInfoऔर TextElementEnumeratorक्लासेस आम तौर पर उपयोगी होना चाहिए और, ज्यादातर मामलों में, कॉल करने वाले से अपेक्षा होती है कि वह एक प्रतिक्रिया देगा। हालांकि, जैसा कि यूनिकोड स्टैंडर्ड एनेक्स # 29 में कहा गया है , "उपयोगकर्ता की धारणाओं के मिलान का लक्ष्य हमेशा सटीक रूप से पूरा नहीं किया जा सकता है क्योंकि अकेले पाठ में हमेशा सीमाओं को तय करने के लिए पर्याप्त जानकारी नहीं होती है।"