ठीक है, .Net और C # में सभी तार UTF-16LE के रूप में एन्कोड किए गए हैं । A string
को वर्णों के अनुक्रम के रूप में संग्रहीत किया जाता है। प्रत्येक char
2 बाइट्स या 16 बिट्स के भंडारण को इनकैप्सुलेट करता है।
एक अक्षर, वर्ण, ग्लिफ़, प्रतीक, या विराम चिह्न के रूप में हम "कागज़ या स्क्रीन पर" जो देखते हैं, उसे एकल पाठ तत्व के रूप में सोचा जा सकता है। जैसा कि यूनिकोड मानक अनुलग्नक # 29 UNICODE TEXT SEGMENTATION में वर्णित है , प्रत्येक पाठ तत्व का प्रतिनिधित्व एक या अधिक कोड बिंदुओं द्वारा किया जाता है। कोड की एक विस्तृत सूची यहां पाई जा सकती है ।
प्रत्येक कोड प्वाइंट को कंप्यूटर द्वारा आंतरिक प्रतिनिधित्व के लिए बाइनरी में एन्कोड किया जाना चाहिए। जैसा कि कहा गया है, प्रत्येक char
2 बाइट्स संग्रहीत करता है। या उससे नीचे के कोड पॉइंट्स को 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 में कहा गया है , "उपयोगकर्ता की धारणाओं के मिलान का लक्ष्य हमेशा सटीक रूप से पूरा नहीं किया जा सकता है क्योंकि अकेले पाठ में हमेशा सीमाओं को तय करने के लिए पर्याप्त जानकारी नहीं होती है।"