सी ++ std::locale
के साधन और पहलू std::codecvt
द्वारा वर्ण एन्कोडिंग का समर्थन करता है। सामान्य विचार यह है कि locale
ऑब्जेक्ट सिस्टम के पहलुओं का वर्णन करता है जो संस्कृति से संस्कृति, (मानव) भाषा से भाषा में भिन्न हो सकते हैं। इन पहलुओं को facet
एस में विभाजित किया गया है, जो टेम्पलेट तर्क हैं जो परिभाषित करते हैं कि कैसे स्थानीयकरण-निर्भर वस्तुओं (I/O धाराएं शामिल हैं) का निर्माण किया जाता है। जब आप istream
से पढ़ते हैं या ostream
पर लिखते हैं, तो प्रत्येक वर्ण का वास्तविक लेखन लोकेल के पहलुओं के माध्यम से फ़िल्टर किया जाता है। पहलुओं में यूनिकोड प्रकारों के न केवल एन्कोडिंग को शामिल किया गया है, बल्कि इस तरह की विविध विशेषताएं हैं कि कितनी बड़ी संख्याएं लिखी गई हैं (जैसे अल्पविराम या अवधि), मुद्रा, समय, पूंजीकरण, और कई अन्य विवरण।
हालांकि सिर्फ इसलिए कि एन्कोडिंग करने के लिए सुविधाएं मौजूद हैं इसका मतलब यह नहीं है कि मानक पुस्तकालय वास्तव में सभी एन्कोडिंग को संभालता है, और न ही यह सही कोड करने के लिए सरल बनाता है। wchar_t
बहुत छोटा हो सकता है (आपके डेटा को मैंगलिंग कर सकता है), या बहुत बड़ा (अंतरिक्ष बर्बाद कर रहा है), और सबसे आम कंपाइलर्स के रूप में आपको उस चरित्र के आकार के रूप में भी पढ़ना चाहिए (एन्कोडिंग भाग अकेला छोड़ना) मुश्किल है, उदाहरण के लिए विजुअल सी ++ और जीएनयू सी ++) उनके कार्यान्वयन पर कितना बड़ा है इस पर भिन्नता है। तो आपको वास्तविक एन्कोडिंग करने के लिए आम तौर पर बाहरी पुस्तकालयों को खोजने की आवश्यकता होती है।
- iconv आम तौर पर है सही होने के लिए स्वीकार करते हैं, लेकिन कैसे सी ++ तंत्र के लिए यह बाध्य करने के उदाहरण मुश्किल है।
- jla3ep mentionslibICU है, जो बहुत ही गहन है, लेकिन C++ API मानक के साथ अच्छी तरह से खेलने की कोशिश नहीं करता है (जहाँ तक मेरा बता सकते हैं:। आप examples स्कैन करते हैं तो आप बेहतर कर सकते हैं देखने के लिए कर सकते हैं)
सबसे सरल उदाहरण मैं पाया जा सकता है कि सभी अड्डों को कवर करता है, बूस्ट के UTF-8 codecvt facet से है, उदाहरण के लिए आईओ धाराओं द्वारा उपयोग के लिए विशेष रूप से यूटीएफ -8 (यूसीएस 4) को एन्कोड करने का प्रयास करता है। ऐसा लगता है, हालांकि मैं सुझाव नहीं देता कि इसे केवल क्रियात्मक रूप से कॉपी करें। यह लेता है एक छोटे से अधिक the source में खुदाई इसे समझने की (और मैं दावा नहीं करते):
typedef wchar_t ucs4_t;
std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);
...
std::wifstream input_file("data.utf8");
input_file.imbue(utf8_locale);
ucs4_t item = 0;
while (ifs >> item) { ... }
स्थानों के बारे में अधिक समझने के लिए, और कैसे वे पहलुओं (codecvt
सहित) का उपयोग, निम्नलिखित पर एक नज़र :
लोकेल के साथ स्ट्रीम कैसे लगाएं। http://stackoverflow.com/questions/207662/writing-utf16-to-file-in-binary-mode/208431#208431 –