2012-09-03 16 views
10

मुझे std::u16string और std::u32string सी ++ 11 में देखने में खुशी है, लेकिन मैं सोच रहा हूं यूटीएफ -8 मामले को संभालने के लिए std::u8string क्यों नहीं है। मैं इस धारणा के तहत हूं कि std::string यूटीएफ -8 के लिए है, लेकिन ऐसा लगता है कि यह बहुत अच्छा नहीं है। मेरा मतलब क्या है, std::string.length() स्ट्रिंग में वर्णों की संख्या के बजाय स्ट्रिंग के बफर का आकार वापस नहीं करता है?std :: u16string, std :: u32string, std :: string, length(), आकार(), कोडपॉइंट्स और वर्ण

तो, length() नई सी ++ 11 कक्षाओं के लिए निर्धारित मानक तारों की विधि कैसी है? क्या वे स्ट्रिंग के बफर का आकार, कोडपॉइंट्स की संख्या, या वर्णों की संख्या (एक सरोगेट जोड़ी 2 कोड अंक मानते हैं, लेकिन एक चरित्र है। अगर मैं गलत हूं तो कृपया मुझे सही करें)?

और size() के बारे में क्या; क्या यह length() के बराबर नहीं है? मेरे भ्रम के स्रोत के लिए http://en.cppreference.com/w/cpp/string/basic_string/length देखें।

तो, मुझे लगता है कि, मेरे मौलिक सवाल यह है कि एक का उपयोग std::string, std::u16string करता है, और std::u32string और ठीक से बफर आकार, कोड पॉइंट्स की संख्या, और वर्णों की संख्या के बीच अंतर है? यदि आप मानक इटरेटर्स का उपयोग करते हैं, तो क्या आप बाइट्स, कोडपॉइंट्स या कैरेक्टरों पर फिर से चल रहे हैं?

+3

'std :: string' utf8 के रूप में utf8 के रूप में काम करता है 'u16string' utf16 के लिए करता है: यह संबंधित प्रकार के तत्वों को संभालता है, और एक से अधिक तत्वों के अनुक्रम द्वारा दर्शाए गए वर्णों से निपटता नहीं है। –

+0

यहां जाएं: http://utf8everywhere.org/#myth.strlen –

उत्तर

15

u16string और u32string "नई सी ++ 11 कक्षाएं" नहीं हैं। वे के char16_t और cha32_t प्रकारों के लिए केवल टाइप किए गए हैं।

length के लिए हमेशा size के बराबर है। यह स्ट्रिंग में T की संख्या है, जहां Tbasic_string के लिए टेम्पलेट प्रकार है।

basic_string यूनिकोड किसी भी तरह, आकार या रूप में अवगत नहीं है। इसमें कोडपॉइंट्स, ग्रैफेम्स, यूनिकोड कैरेक्टर, यूनिकोड सामान्यीकरण, या किसी भी प्रकार की कोई अवधारणा नहीं है। यह केवल T एस का ऑर्डर किया गया अनुक्रम है। एकमात्र चीज जो यूनिकोड-u16string और u32string के बारे में जागरूक है, वह यह है कि वे u"" और U"" अक्षरों द्वारा लौटाए गए प्रकार का उपयोग करते हैं। इस प्रकार, वे यूनिकोड-एन्कोडेड तारों को स्टोर कर सकते हैं, लेकिन वे कुछ भी नहीं करते हैं जिसके लिए कहा गया एन्कोडिंग के ज्ञान की आवश्यकता होती है।

इटरेटर T के तत्वों पर पुनरावृत्त नहीं करते हैं, "बाइट्स, कोडपॉइंट्स या वर्ण" नहीं। यदि Tchar16_t है, तो यह char16_t से अधिक होगा। यदि स्ट्रिंग यूटीएफ -16-एन्कोडेड है, तो यह यूटीएफ -16 कोड इकाइयों पर फिर से चल रही है, न कि यूनिकोड कोडपॉइंट्स या बाइट्स।

+4

यूनिकोड शब्दावली में, 'टी' =" कोड इकाई "। – dan04

+1

और * कोड इकाई *! = * कोड बिंदु *। वे दो अलग अवधारणाएं हैं। बस बाद के संदर्भ के लिए क्योंकि मुझे नहीं पता था कि ... – Eonil

1

सभी स्ट्रिंग प्रकार एक ही काम करते हैं: वे तत्वों का अनुक्रम रखते हैं, जिनमें से प्रत्येक प्रकार स्ट्रिंग के लिए वर्ण प्रकार है। length() और size() दोनों तत्वों की संख्या लौटते हैं। तत्वों पर Iterators iterator। उच्च स्तर के विश्लेषण, जैसे वर्णों की संख्या को समझना, अधिक जटिल गणना की आवश्यकता होती है।

0

वर्तमान में कोड इकाइयों, कोडपॉइंट्स या व्यक्तिगत बाइट्स के बीच अंतर करने के लिए मानक में कुछ भी नहीं बनाया गया है। हालांकि, this sort of thing से निपटने के लिए कार्यों में कुछ चीजें प्रतीत होती हैं। मानक समिति का निर्णय लेने के आधार पर, यह TR2 या अगले मानक का हिस्सा हो सकता है।

संबंधित मुद्दे