2011-05-16 25 views
11

सी ++ 03 दो वर्ण प्रकारों को परिभाषित करता है: char और wchar_t। (signed char और unsigned char पागलपन) को अनदेखा करने देता है।std :: u16cout क्यों गुम है?

इन दो वर्णों को std::basic_string, std::basic_ostream, आदि std::string/std::wstring और std::ostream/std::wostream पर लागू किया गया है।

धाराओं से मानक पुस्तकालय भी ग्लोबल्स std::cout और std::wcout परिभाषित करता है।

नया सी ++ 0x मानक दो और वर्ण प्रकार char16_t और char32_t परिभाषित करता है। हालांकि, केवल नए टाइपिफऔर std::u32string हैं।

मानक आपूर्ति std::u16ostream क्यों नहीं है? या std::u32cout के बारे में कैसे?

+5

आपको ऐसा क्यों लगता है कि इसकी आवश्यकता है? एक धारा बाइट्स का सिर्फ एक अनुक्रम है। क्या यह अलग-अलग प्रारूपों में स्ट्रीम लिखने और पढ़ने की संभावना कम करता है? नहीं। एक बार std :: ostream के साथ एक स्ट्रीम लिख सकता है और std :: u16stream के साथ पढ़ सकता है और धाराएं बस काम करेंगी (इसलिए गलत चीज़ करने से कोई अतिरिक्त सुरक्षा नहीं है)। तो सही प्रकार के ऑब्जेक्ट में स्ट्रीम पढ़ने के लिए responcability अभी भी प्रोग्रामर को पड़ता है क्योंकि आने वाली धारा के प्रकार (यह केवल बाइट्स का अनुक्रम) निर्धारित करने का कोई वास्तविक तरीका नहीं है। –

+0

मान्य है, 'std :: u32cout' का उपयोग अक्सर होने की संभावना नहीं है। मैं केवल एक आवेदन के कंसोल आउटपुट को अंतर्राष्ट्रीयकरण की कल्पना कर सकता हूं। हालांकि, एक 'std :: u32ofstream' तुरंत उपयोगी होगा। –

+0

@deft_code: मुझे नहीं लगता कि यह कैसे उपयोगी है। आपको अधिक जानकारी में व्याख्या करने की आवश्यकता होगी कि आपको लगता है कि यह उपयोगी क्यों है। आप स्ट्रीम में स्टोरेज प्रारूप को हार्डकोड कर रहे हैं, फिर भी आपके पास यह पता लगाने का कोई तरीका नहीं है कि धारा वास्तव में उस प्रारूप का उपयोग करके बनाई गई थी या नहीं। –

उत्तर

18

यह निर्णय लिया गया है कि यूनिकोड iostreams को लागू था बहुत ज्यादा काम इसके लायक होने के लिए: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2238.html

कागज से:

दो नए प्रकार की धारा विशेषज्ञताओं बाहर छोड़ने के लिए तर्क यह है कि नदियों था गैर-प्रकार के प्रकारों ने व्यापक उपयोग को आकर्षित नहीं किया है, इसलिए यह स्पष्ट नहीं है कि इस जटिल मशीनरी की specalizations की संख्या दोगुना करने की वास्तविक आवश्यकता है।

जो मैं समझता हूं, उससे मानक समिति को एहसास हुआ कि विस्तृत चरित्र (2- या 4-बाइट प्रारूप) के क्रमबद्धता असामान्य है, और जहां आपको यूटीएफ -16 या यूटीएफ -32 की आवश्यकता होगी, आप इसे हमेशा स्वयं लागू कर सकते हैं वही पुरानी चार-आधारित बाइट स्ट्रीम का उपयोग करके, लेकिन कोडेकवेट पहलू के साथ आपके इनपुट को यूटीएफ -16/यूटीएफ -32 में परिवर्तित कर दिया जाएगा, जो कि अभी तक एक-मल्टीबाइट-प्रारूप के रूप में व्यवहार कर सकता है।

2

मुझे आधिकारिक कारण पता नहीं है।

लेकिन मुझे एक की आवश्यकता नहीं दिखती है।
एक विशिष्ट प्रकार की धाराएं होने से आप वहां कड़ी कोडिंग कर रहे हैं। मैं उन धाराओं को प्राथमिकता दूंगा जो सामान्य हैं (बाइट्स को संभाल लें) जिन्हें आप आउटपुट को किसी विशिष्ट प्रारूप में अनुकूलित कर सकते हैं। जैसे वे वर्तमान में काम करते हैं।

तो आंतरिक रूप से मैं यूटीएफ 16 तारों का उपयोग करना चाहता हूं। लेकिन आउटपुट पर मैं उन्हें भंडारण के लिए यूटीएफ 8 में क्रमबद्ध करना चाहता हूं। इसके लिए मैं बस एक सामान्य धारा बनाने के लिए बाहर निकलता हूं जो इसे लोकेल के साथ जोड़ता है जो जानता है कि यूटीएफ 16 -> यूटीएफ 8 से कैसे परिवर्तित किया जाए, तो सभी स्ट्रीम को बाइट्स हैंडल करना है।

स्ट्रीम होने से डिस्क बहुत कम हो जाती है। एक लोकेल होने के कारण जो विभिन्न प्रारूपों (डिवाइस पर आंतरिक और vic versa) के बीच परिवर्तित हो सकता है, बहुत सुविधाजनक है।

+0

कभी-कभी आप यूटीएफ -16 या यूटीएफ -32 को क्रमबद्ध करना चाहते हैं - ज्यादातर अन्य सॉफ़्टवेयर के साथ संगतता के लिए (कुछ विंडोज़ फ़ाइल प्रारूप उदाहरण के लिए यूटीएफ -16 का उपयोग करते हैं)। लेकिन मुझे लगता है कि आप अभी भी उचित कोडेकैट पहलू का उपयोग करके एक सादे बाइट-स्ट्रीम के साथ उनका उपयोग कर सकते हैं। –

+0

@ बोआज़ यानिव: बिल्कुल मैं एक विशेष प्रारूप में क्रमबद्ध करने में सक्षम होना चाहता हूं। लेकिन मुझे नहीं लगता कि धारा उस पर नियंत्रण में होनी चाहिए। यह एक प्रतिनिधित्व को दूसरे में परिवर्तित करने के लिए स्थानीय का काम है। जब आप किसी फ़ाइल को स्ट्रिंग को क्रमबद्ध करते हैं तो आपको यह जानने की आवश्यकता होती है कि आप किस प्रारूप को क्रमबद्ध कर रहे हैं और आपको इसे वापस पढ़ने पर भी यह जानकारी जाननी होगी। यह उचित स्थानीय के साथ स्ट्रीम को इम्बोइंग करके किया जाता है जो रूपांतरण करेगा। –

+0

नाइटपीकी होने से नफरत है लेकिन यह "लोकेल" है, न कि "स्थानीय"। –

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