C ++ 11 में स्ट्रिंग शाब्दिक के लिए यूनिकोड एन्कोडिंग


85

संबंधित प्रश्न के बाद , मैं C ++ 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", और गैर-बीएमपी कोडपॉइंट दो-इकाई UTF16 अनुक्रम में एन्कोड हो जाता है? और इसी तरह के लिए u8? (1) में, क्या मैं अकेला सरोगेट लिख सकता हूँ \u? अंत में, किसी भी स्ट्रिंग फ़ंक्शंस को जागरूक करना (यानी वे चरित्र-जागरूक हैं और अमान्य बाइट अनुक्रमों का पता लगा सकते हैं)?

यह एक खुले-समाप्त प्रश्न का एक सा है, लेकिन मैं नए UTF-एन्कोडिंग और नए C ++ 11 के प्रकार की सुविधाओं के रूप में संभव के रूप में एक चित्र प्राप्त करना चाहता हूं।


4
जीसीसी u"\U0010FFFF"एक सरोगेट जोड़ी में शामिल है।
kennytm

जवाबों:


57

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

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

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

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

उपयोग की गई कोड इकाइयों की संख्या यूनिकोड एन्कोडिंग पर आधारित है।

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

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

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

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

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

बिलकुल नहीं। खैर, मुझे लगता है कि rephrase करने के लिए अनुमति देते हैं।

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

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

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


7
@ फीलिप: नहीं, वे नहीं हैं। यूनिकोड विशेष रूप से उन्हें UTF-16 सरोगेट के लिए आरक्षित करता है। और, जैसा कि कहा गया है, सी ++ 0x के विनिर्देश कहते हैं कि यदि आप उस सीमा में एक कोड बिंदु को नामित करने का प्रयास करते हैं तो संकलन विफल हो जाएगा।
निकोल बोलस

12
आपका लिंक साबित होता है कि वे कर रहे हैं कोड अंक। यदि आप विकिपीडिया पर भरोसा नहीं करते हैं, तो मानक के अध्याय 3 में परिभाषा 9 और 10 पढ़ें। स्ट्रिंग लिटरल में सरोगेट कोड पॉइंट C ++ 0x में नियम code 2.4 / 2 द्वारा निषिद्ध हैं, हालाँकि।
फिलिप

1
पढ़ने के बाद मैं इस बात की भी पुष्टि करता हूं कि सरोगेट कोड पॉइंट्स स्ट्रिंग लिटरल्स में स्वीकार किए जाते हैं।
जॉर्ज कोर्टिस

सी 11 में, \xकुछ भी साथ नहीं किया जा सकता है के लिए उदाहरण U + 1F984 \ एक्स उपसर्ग के साथ काम नहीं करेंगे, और \uऔर \U, ASCII नियंत्रण पात्रों के साथ नहीं किया जा सकता बजना में कम से कम।
मार्कस जे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.