दिलचस्प पोस्ट
मैं Python में लॉग फ़ाइल में sys.stdout कैसे डुप्लिकेट करूं? String.split पाइप सीमांकक को बचने की आवश्यकता क्यों है? कब है। (सफलता, असफल) वादों के लिए एक विरोधी माना जाता है? कोई कनेक्शन नहीं किया जा सकता क्योंकि लक्ष्य मशीन ने इसे सक्रिय रूप से 127.0.0.1:3446 से इनकार कर दिया क्या एक ईवेंट हैंडलर पहले से जोड़ा गया है? मैं इसे कैसे डाउनलोड करने की बजाय आवेदन / जेसन प्रदर्शित करने के लिए IE को समझ सकता हूं? जावा का उपयोग करके लाइन से एक बड़ी टेक्स्ट फ़ाइल लाइन कैसे पढ़ी जा सकती है? क्या जावा में रिवर्स लुकअप के साथ एक हैशमैप है? जेमेनूइटम इमेज Icon बहुत बड़ा है स्थैतिक प्रारंभिक ब्लाकों तेज़ स्ट्रिंग में डेटा को स्विफ्ट में कैसे परिवर्तित करें अनुप्रयोग सर्वर और वेब सर्वर में क्या अंतर है? बैश चर असाइनमेंट में कमांड को त्रुटि नहीं मिली क्लाइंट साइड पर पासवर्ड एन्क्रिप्शन "WaitForExit" पर लटका हुआ ProcessStartInfo? क्यूं कर?

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

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

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

वेब के समाधान से एकत्रित समाधान "सी ++ 11 में स्ट्रिंग लीटरल्स के लिए यूनिकोड एन्कोडिंग"

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

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

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

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

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

क्या "u" और "8" स्ट्रिंग्स में एन्कोडिंग शब्दार्थ हैं, जैसे मैं कह सकता हूँ char16_t x [] = u "\ U0010FFFF", और गैर-बीएमपी कोडपॉइंट को दो यूनिट UTF16 अनुक्रम में एन्कोड किया जाता है?

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

(1) में, क्या मैं अकेला अकेला \ u \ u0026 लिख सकता हूं?

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

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

बिलकुल नहीं। खैर, मुझे दोबारा रगड़ने दे।

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

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

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