c++ - सी++ 11 में स्ट्रिंग अक्षर के लिए यूनिकोड एन्कोडिंग



unicode c++11 (1)

क्या \ x / \ u / \ U वर्ण संदर्भ सभी स्ट्रिंग प्रकारों के साथ स्वतंत्र रूप से संयोज्य हैं?

संख्या \x का उपयोग किसी भी चीज़ में किया जा सकता है, लेकिन \u और \U केवल उन तारों में उपयोग किया जा सकता है जो विशेष रूप से यूटीएफ-एन्कोडेड हैं। हालांकि, किसी भी यूटीएफ-एन्कोडेड स्ट्रिंग के लिए, \u और \U का उपयोग फिट के रूप में किया जा सकता है।

क्या सभी स्ट्रिंग प्रकार निश्चित-चौड़ाई हैं, यानी सरणी में अक्षर के रूप में सटीक रूप से कई तत्व होते हैं, या \ x / \ u / \ U संदर्भों को बाइट्स की एक चर संख्या में विस्तारित किया जाता है?

जिस तरह से आप मतलब नहीं है। \x , \u , और \U स्ट्रिंग एन्कोडिंग के आधार पर परिवर्तित हो जाते हैं। उन "कोड इकाइयों" की संख्या (यूनिकोड शब्दों का उपयोग करना। char16_t एक यूटीएफ -16 कोड इकाई है) मान युक्त स्ट्रिंग के एन्कोडिंग पर निर्भर करता है। शाब्दिक u8"\u1024" एक स्ट्रिंग बना देगा जिसमें 2 char s प्लस एक नल टर्मिनेटर होगा। शाब्दिक u"\u1024" एक स्ट्रिंग बना देगा जिसमें 1 char16_t प्लस एक नल टर्मिनेटर होगा।

इस्तेमाल की जाने वाली कोड इकाइयों की संख्या यूनिकोड एन्कोडिंग पर आधारित है।

क्या आप "" और u8 "" तारों में एन्कोडिंग सेमेटिक्स हैं, उदाहरण के लिए मैं char16_t x [] = u "\ U0010FFFF" कह सकता हूं, और गैर-बीएमपी कोडपॉइंट दो-इकाई यूटीएफ 16 अनुक्रम में एन्कोड हो जाता है?

u"" एक यूटीएफ -16 एन्कोडेड स्ट्रिंग बनाता है। u8"" एक यूटीएफ -8 एन्कोडेड स्ट्रिंग बनाता है। उन्हें यूनिकोड विनिर्देश के अनुसार एन्कोड किया जाएगा।

में (1), क्या मैं आपके साथ अकेले सरोगेट लिख सकता हूं?

बिलकुल नहीं। विनिर्देशन यूटीएफ -16 सरोगेट जोड़े (0xD800-0xDFFF) का उपयोग \u या \U लिए कोडपॉइंट्स के रूप में स्पष्ट रूप से प्रतिबंधित करता है।

अंत में, क्या स्ट्रिंग फ़ंक्शंस एन्कोडिंग में से कोई भी है (यानी वे चरित्र-जागरूक हैं और अमान्य बाइट अनुक्रमों का पता लगा सकते हैं)?

बिलकुल नहीं। खैर, मुझे इसे फिर से बदलने की अनुमति दें।

std::basic_string यूनिकोड एन्कोडिंग से निपटता नहीं है। वे निश्चित रूप से यूटीएफ-एन्कोडेड तारों को स्टोर कर सकते हैं। लेकिन वे केवल उनके बारे में char , char16_t , या char32_t अनुक्रम के रूप में सोच सकते हैं; वे उनको यूनिकोड कोडपॉइंट्स के अनुक्रम के रूप में नहीं सोच सकते हैं जो एक विशेष तंत्र के साथ एन्कोड किए गए हैं। basic_string::length() कोड इकाइयों की संख्या वापस कर देगा, कोड बिंदु नहीं। और जाहिर है, सी मानक लाइब्रेरी स्ट्रिंग फ़ंक्शन पूरी तरह से बेकार हैं

यह ध्यान दिया जाना चाहिए कि यूनिकोड स्ट्रिंग के लिए "लंबाई" का मतलब कोडपॉइंट्स की संख्या नहीं है। कुछ कोड बिंदु "वर्ण" (एक दुर्भाग्यपूर्ण नाम) को जोड़ रहे हैं, जो पिछले कोडपॉइंट के साथ गठबंधन करते हैं। तो एकाधिक कोडपॉइंट्स एक एकल दृश्य चरित्र को मैप कर सकते हैं।

Iostreams वास्तव में यूनिकोड-एन्कोडेड मानों को पढ़ / लिख सकते हैं। ऐसा करने के लिए, आपको एन्कोडिंग निर्दिष्ट करने के लिए एक लोकेल का उपयोग करना होगा और इसे विभिन्न स्थानों पर ठीक से लगा देना होगा। ऐसा करने से आसान कहा जाता है, और मेरे पास आपको दिखाने के लिए मेरे पास कोई कोड नहीं है।

संबंधित प्रश्न के बाद, मैं सी ++ 11 में नए चरित्र और स्ट्रिंग शाब्दिक प्रकारों के बारे में पूछना चाहता हूं। ऐसा लगता है कि अब हमारे पास चार प्रकार के अक्षर और पांच प्रकार के स्ट्रिंग अक्षर हैं। चरित्र प्रकार:

char     a =  '\x30';         // character, no semantics
wchar_t  b = L'\xFFEF';       // wide character, no semantics
char16_t c = u'\u00F6';       // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF';   // 32-bit, assumed UCS-4

और स्ट्रिंग अक्षर:

char     A[] =  "Hello\x0A";         // byte string, "narrow encoding"
wchar_t  B[] = L"Hell\xF6\x0A";      // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6";        // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto     E[] = u8"\u00F6\U0010FFFF"; // (3)

सवाल यह है: क्या \x / \u / \U वर्ण संदर्भ सभी स्ट्रिंग प्रकारों के साथ स्वतंत्र रूप से संयोज्य हैं? क्या सभी स्ट्रिंग प्रकार निश्चित-चौड़ाई हैं, यानी सरणी में अक्षर के रूप में सटीक रूप से कई तत्व होते हैं, या \x / \u / \U संदर्भों को बाइट्स की एक चर संख्या में विस्तारित किया जाता है? क्या u"" और u8"" तारों में एन्कोडिंग char16_t x[] = u"\U0010FFFF" हैं, उदाहरण के लिए मैं char16_t x[] = u"\U0010FFFF" कह सकता हूं, और गैर-बीएमपी char16_t x[] = u"\U0010FFFF" दो-इकाई यूटीएफ 16 अनुक्रम में एन्कोड हो जाता है? और इसी तरह u8 ? में (1), क्या मैं आपके साथ अकेले सरोगेट लिख सकता हूं? अंत में, क्या स्ट्रिंग फ़ंक्शंस एन्कोडिंग में से कोई भी है (यानी वे चरित्र-जागरूक हैं और अमान्य बाइट अनुक्रमों का पता लगा सकते हैं)?

यह एक ओपन-एंडेड प्रश्न का थोड़ा सा है, लेकिन मैं नए यूटीएफ-एन्कोडिंग और नई सी ++ 11 की सुविधाओं की सुविधा के रूप में एक तस्वीर को पूरा करना चाहता हूं।





string-literals