2011-02-01 14 views
13

मैं std :: string और std :: wstring के बारे में सब कुछ जानता हूं लेकिन वे यूटीएफ -8 और यूटीएफ -16 (कम से कम विंडोज़ पर) के विस्तारित वर्ण एन्कोडिंग पर पूरी तरह से ध्यान नहीं देते हैं। यूटीएफ -32 के लिए भी कोई समर्थन नहीं है।क्या कोई एसटीएल स्ट्रिंग क्लास है जो यूनिकोड को सही तरीके से संभालती है?

तो क्या कोई भी क्रॉस-प्लेटफार्म ड्रॉप-इन प्रतिस्थापन कक्षाओं के बारे में जानता है जो पूर्ण यूटीएफ -8, यूटीएफ -16 और यूटीएफ -32 समर्थन प्रदान करते हैं?

उत्तर

9
सी में

खैर ++ 0x वहाँ वर्गों std :: u32string और std :: u16string हैं। जीसीसी पहले से ही आंशिक रूप से उनका समर्थन करता है, इसलिए आप पहले से ही उनका उपयोग कर सकते हैं, लेकिन यूनिकोड के लिए समर्थन स्ट्रीम अभी तक Unicode support in C++0x नहीं किया गया है।

+0

हम्म मैंने नहीं देखा कि नए मानक में। बहुत ही रोचक। एक बड़ी शर्म की बात है कि मैं इसका उपयोग C++ 0x समर्थन (जैसे आईफोन कंपाइलर) की कमी वाले कंपाइलरों पर नहीं कर सकता। यह वास्तव में मुझे झटके देता है कि ये कक्षाएं पहले से मौजूद नहीं हैं ... – Goz

+0

दिलचस्प बात यह है कि जीसीसी> 4.4 और वीएस -2010 दोनों इसका समर्थन करते हैं। जो शानदार है। विंडोज़, लिनक्स और एंड्रॉइड मोबाइल प्लेटफ़ॉर्म को कवर करने वाले प्रमुख प्लेटफ़ॉर्म पर।क्लैंग ने यह भी कहा कि "कई" उदाहरण काम करते हैं ... – Goz

+2

@Goz ठीक है सबकुछ उतना अच्छा नहीं है जितना आप सोचते हैं। वीएस -2010 यूनिकोड स्ट्रिंग का समर्थन करता है, लेकिन यह यूनिकोड स्ट्रिंग अक्षर का समर्थन नहीं करता है। यू "हैलो" यूटीएफ -16 स्ट्रिंग शाब्दिक है और यू "हैलो" यूटीएफ -32 शाब्दिक है। दृश्य स्टूडियो उन्हें पहचान नहीं है। और जैसा कि मैंने पहले ही कहा है कि जीसीसी इनपुट, आउटपुट स्ट्रीम का समर्थन नहीं करता है। – UmmaGumma

7

यह एसटीएल नहीं है, लेकिन यदि आप सी ++ में उचित यूनिकोड चाहते हैं, तो आपको ICU पर एक नज़र रखना चाहिए।

+0

दिलचस्प लग रहा है। शर्म की बात है कि इससे कोई एसटीएल स्ट्रिंग समर्थन नहीं है ... यह उस मामले में सही होगा ... – Goz

+0

इसके बारे में पढ़ें, लेकिन डीबी 2 के साथ कुछ समय बिताने के बाद, मैं आईबीएम से आने वाली किसी भी चीज़ को छूने से पहले दो बार सोचूंगा। क्या आपने इसके साथ काम किया है? अच्छी है? – davka

+1

@Goz: मैं और अधिक सहमत नहीं हो सका, यूनिकोड "मानक" पर्याप्त है कि हम एक स्ट्रिंग की इच्छा कर सकते हैं जो बाइट अनुक्रमों को संग्रहीत करने से अधिक करे ... –

3

एसटीएल पर यूटीएफ -8 का कोई समर्थन नहीं है। एक विकल्प के youo boost codecvt उपयोग कर सकते हैं के रूप में:

//... 
// My encoding type 
typedef wchar_t ucs4_t; 

std::locale old_locale; 
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>); 

// Set a New global locale 
std::locale::global(utf8_locale); 

// Send the UCS-4 data out, converting to UTF-8 
{ 
    std::wstringstream oss; 
    oss.imbue(utf8_locale); 
    std::copy(ucs4_data.begin(),ucs4_data.end(), 
     std::ostream_iterator<ucs4_t,ucs4_t>(oss)); 

    std::wcout << oss.str() << std::endl; 
} 
+0

हालांकि यह वास्तव में एक सोपिन प्रतिस्थापन नहीं है;) आदर्श रूप से मुझे देखना अच्छा लगेगा std :: string8, std :: string16 और std :: string32 जैसे कुछ ... – Goz

2

यूटीएफ -8 समर्थन के लिए, Glib::ustring कक्षा है। यह std::string के बाद मॉडलिंग किया गया है लेकिन utf-8 जागरूक है, उदाहरण के लिए। जब आप एक इटरेटर के साथ स्ट्रिंग स्कैन कर रहे हैं। इसमें कुछ प्रतिबंध भी हैं, उदा। इटरेटर हमेशा const होता है, क्योंकि एक चरित्र को प्रतिस्थापित करने से स्ट्रिंग की लंबाई बदल सकती है और इसलिए यह अन्य इटरेटर्स को अमान्य कर सकता है।

ustring स्वचालित रूप से अन्य एन्कोडिंग को utf-8, Glib लाइब्रेरी में इसके लिए conversion functions में परिवर्तित नहीं करता है। आप मान्य कर सकते हैं कि स्ट्रिंग वैध यूटीएफ -8 है या नहीं।

और यह भी, ustring और std::string परस्पर विनिमय कर रहे, यानी ustring std करने के लिए एक डाली ऑपरेटर है :: स्ट्रिंग ताकि आप एक पैरामीटर जहां एक std::string की उम्मीद है के रूप में एक ustring पारित कर सकते हैं, और इसके विपरीत जाहिर है, के रूप में ustring निर्माण किया जा सकता std::string से।

+0

लगभग सही है। कोई 16 और 32-बिट यूनिकोड समर्थन के बारे में शर्म आती है ... – Goz

11

और हल्के, बहुत उपयोगकर्ता के अनुकूल, हेडर-केवल यूटीएफ -8 लाइब्रेरी UTF8-CPP को न भूलें। ड्रॉप-इन प्रतिस्थापन नहीं है, लेकिन आसानी से std::string के संयोजन के साथ उपयोग किया जा सकता है और इसमें कोई बाहरी निर्भरता नहीं है।

+0

यह एक अच्छी छोटी लाइब्रेरी है :) – Skurmedel

2

Qt में क्यूस्ट्रिंग है जो आंतरिक रूप से यूटीएफ -16 का उपयोग करती है, लेकिन इसमें std :: wstring, UTF-8, लैटिन 1 या लोकेल एन्कोडिंग से कनवर्ट करने के तरीके हैं। QTextCodec क्लास भी है जो QStrings को मूल रूप से या उससे कुछ भी परिवर्तित कर सकती है। लेकिन सिर्फ स्ट्रिंग के लिए क्यूटी का उपयोग करना मेरे लिए एक ओवरकिल जैसा लगता है।

+0

हाँ, हां, आप तारों के लिए पूरी तरह से इसका उपयोग करने पर पूरी तरह से सही हैं। मुझे क्यूटी पसंद है हालांकि और इसे थोड़ा सा उपयोग करें :) – Goz

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