2009-03-07 8 views
8

मैंने देखा कि सी ++ 0x यूटीएफ -8, यूटीएफ -16 और यूटीएफ -32 अक्षरों के लिए समर्थन जोड़ देगा। लेकिन तीन प्रतिनिधित्वों के बीच रूपांतरण के बारे में क्या?क्या सी ++ 0x यूटीएफ -8 बाइट अनुक्रम से/std :: wstring रूपांतरण का समर्थन करता है?

मैं अपने कोड में हर जगह std :: wstring का उपयोग करने की योजना बना रहा हूं। लेकिन फ़ाइलों और नेटवर्क से निपटने के दौरान मुझे यूटीएफ -8 एन्कोडेड डेटा में हेरफेर करने की भी आवश्यकता है। क्या सी ++ 0x इन परिचालनों के लिए भी समर्थन प्रदान करेगा?

उत्तर

15

सी ++ 0x, char16_t और char32_t यूटीएफ -16 और यूटीएफ -32 स्टोर करने के लिए और wchar_t स्टोर करने के लिए उपयोग नहीं किया जाएगा।

मसौदा n2798 से

:

22.2.1.4 कक्षा टेम्पलेट codecvt

2 वर्ग codecvt जब इस तरह के विस्तृत वर्णों के पात्रों multibyte करने से के रूप में एक से दूसरे codeset से परिवर्तित, उपयोग के लिए है या यूनिकोड और ईयूसी जैसे विस्तृत चरित्र एन्कोडिंग के बीच।

3 तालिका 76 (22.1.1.1.1) में आवश्यक विशेषज्ञता कार्यान्वयन को परिवर्तित करें- परिभाषित मूल चरित्र सेट। codecvt एक degenerate रूपांतरण लागू करता है; यह बिल्कुल परिवर्तित नहीं होता है। विशेषज्ञता codecvt<char16_t, char, mbstate_t> यूटीएफ -16 और यूटीएफ -8 एन्कोडिंग योजनाओं के बीच परिवर्तित हो जाती है, और विशेषज्ञता codecvt <char32_t, char, mbstate_t> यूटीएफ -32 और यूटीएफ -8 एन्कोडिंग योजनाओं के बीच परिवर्तित हो जाती है। codecvt<wchar_t,char,mbstate_t> संकीर्ण और विस्तृत वर्णों के लिए मूल चरित्र सेट के बीच परिवर्तित करता है। mbstate_t पर विशेषज्ञताएं लाइब्रेरी कार्यान्वयनकर्ता को ज्ञात एन्कोडिंग के बीच रूपांतरण करें।

अन्य एन्कोडिंग को उपयोगकर्ता द्वारा परिभाषित राज्य प्रकार के प्रकार पर विशेषज्ञता करके परिवर्तित किया जा सकता है। स्टेटटी ऑब्जेक्ट में कोई भी राज्य हो सकता है जो विशेष do_in या do_out सदस्यों से या उससे संवाद करने के लिए उपयोगी है।

बात के बारे में wchar_t है कि यह प्रयोग किया जाता है एन्कोडिंग के बारे में आप किसी भी गारंटी नहीं देता है। यह एक प्रकार है जो एक मल्टीबाइट चरित्र पकड़ सकता है। अवधि। यदि आप सॉफ्टवेयर अब लिखने जा रहे हैं, तो आपको इस समझौता के साथ रहना होगा। सी ++ 0x अनुपालन कंपाइलर्स अभी तक बहुत रो रहे हैं। आप हमेशा वीसी -2010 सीटीपी और जी ++ कंपाइलर्स को इसके लायक होने का प्रयास कर सकते हैं। इसके अलावा, wchar_t के विभिन्न प्लेटफार्मों पर अलग-अलग आकार हैं जो देखने के लिए एक और चीज है (वीएस/विंडोज़ पर 2 बाइट्स, जीसीसी/मैक पर 4 बाइट्स और इसी तरह)। इस मुद्दे को और जटिल करने के लिए जीसीसी के लिए -fshort-wchar जैसे विकल्प हैं।

इसलिए सबसे अच्छा समाधान मौजूदा पुस्तकालय का उपयोग करना है। यूनिकोड बग का पीछा करना प्रयास/समय का सबसे अच्छा संभव उपयोग नहीं है।

अधिक C++ 0x यूनिकोड पर स्ट्रिंग शाब्दिक here

0

आप dirkgently धन्यवाद: मैं आप पर एक नज़र डालें सुझाव देना चाहेंगे। मैं अभी तक पंजीकृत नहीं हूं, इसलिए मैं टिप्पणी के रूप में सीधे ऊपर या प्रतिक्रिया नहीं दे सकता।

मैंने codecvt के साथ कुछ सीखा है। मैं आपके द्वारा सुझाए गए पुस्तकालयों के बारे में जानता था और निम्न संसाधन भी उपयोगी हो सकता है http://www.unicode.org/Public/PROGRAMS/CVTUTF/

परियोजना एक पुस्तकालय के लिए है जो खुला स्रोत होना चाहिए। मैं बाहरी पुस्तकालयों के साथ निर्भरताओं को कम करना पसंद करूंगा। मेरे पास पहले से ही libgc और boost के साथ निर्भरता है, हालांकि बाद में मैं केवल थ्रेड का उपयोग करता हूं। मैं वास्तव में सी ++ मानक से चिपकना पसंद करूंगा और मैं थोड़ा निराश हूं कि जीसी समर्थित किसी भी तरह से गिरा दिया गया है।

स्पष्ट रूप से वीसी ++ एक्सप्रेस 2008 को अधिकांश सी ++ 0x मानक के साथ-साथ आईसीसी का समर्थन करने के लिए कहा जाता है। चूंकि मैं वर्तमान में वीसी ++ के साथ विकसित हूं और लाइब्रेरी जारी होने तक इसमें कुछ समय लगेगा, मैं codecvt और char32_t स्ट्रिंग्स का उपयोग करने का प्रयास करना चाहता हूं।

क्या कोई यह जानता है कि यह कैसे करें? क्या मुझे एक और सवाल पोस्ट करना चाहिए?

+0

शायद एक और सवाल शायद सबसे अच्छी बात है। – dalle

+0

@chmike: 08 में लैम्ब्डा समर्थन की कमी ने मुझे आगे नहीं देखा। हालांकि, मैं VS2008 (मेरे पास प्रो) में सी ++ 0x संगतता की सीमा को देख सकता हूं। ओपन सोर्स कंपाइलर द्वारा समर्थित ओपन सोर्स प्रोजेक्ट नहीं है? बस उत्सुक (भले ही 08 एक्सप्रेस एडन मुक्त है)। और पूछने के लिए स्वतंत्र महसूस करें! – dirkgently

+0

@dirkgently मैं पैकेज को VC08, g ++ और बाद में आईसीसी के साथ काम करने की कोशिश कर रहा हूं। यह मुझे मानक के साथ चिपकने के लिए मजबूर करता है। इस प्रयास ने मुझे कुछ बग खोजने में मदद की जो कंपेलरों का पता नहीं लगा। कुछ जहां जी ++ और दूसरों द्वारा वीसी 08 द्वारा पता चला। – chmike

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