2013-03-18 7 views
9

मैं सी ++ 11 की नई यूनिकोड कार्यक्षमता की खोज कर रहा हूं, और other C++11 encoding questions बहुत उपयोगी रहा है, मेरे पास cppreference से निम्न कोड स्निपेट के बारे में कोई प्रश्न है। कोड लिखता है और फिर तुरंत यूटीएफ -8 एन्कोडिंग के साथ सहेजी गई एक टेक्स्ट फ़ाइल पढ़ता है।सी ++ में यूटीएफ -8 पढ़ना/लिखना/प्रिंट करना 11

// Write 
std::ofstream("text.txt") << u8"z\u6c34\U0001d10b"; 

// Read 
std::wifstream file1("text.txt"); 
file1.imbue(std::locale("en_US.UTF8")); 
std::cout << "Normal read from file (using default UTF-8/UTF-32 codecvt)\n"; 
for(wchar_t c; file1 >> c;) // ? 
    std::cout << std::hex << std::showbase << c << '\n'; 

मेरा प्रश्न काफी बस, यही कारण है कि एक wchar_tfor पाश में की जरूरत है? एक u8 स्ट्रिंग शाब्दिक को सरल char * का उपयोग करके घोषित किया जा सकता है और यूटीएफ -8 एन्कोडिंग के बिट लेआउट को सिस्टम की चौड़ाई को सिस्टम को बताना चाहिए। ऐसा लगता है कि यूटीएफ -8 से यूटीएफ -32 (इसलिए wchar_t) में कुछ स्वचालित रूपांतरण है, लेकिन यदि ऐसा है, तो रूपांतरण आवश्यक क्यों है?

+0

यह कई चीजों पर निर्भर करता है। – sehe

+1

'wchar_t' क्योंकि' wifstream' प्रयोग किया जाता है प्रयोग किया जाता है, और 'wifstream' प्रदर्शन (की आवश्यकता होती है _at अमानक एपीआई की एक अच्छी संख्या में कॉल IIRC least_) उल्लेखनीय है, सही UTF8 व्यवहार अत्यंत कठिन एक सांत्वना आवेदन में Windows का उपयोग कर असंभव नहीं तो है कि आप "कुछ स्वचालित रूपांतरण" का जिक्र करते हैं। मेरा मुद्दा उस स्वचालित रूपांतरण (जैसा कि एक विशेष मंच के लिए लागू किया गया है) और स्पष्ट, पोर्टेबल, लोकेल-स्वतंत्र, यूनिकोड रूपांतरण 'codecvt_utf8_utf16' द्वारा प्रदान किया गया अंतर) के बीच का अंतर दिखाना था। – Cubbi

उत्तर

5

आप wchar_t का उपयोग करते हैं क्योंकि आप wifstream का उपयोग कर फ़ाइल पढ़ रहे हैं; यदि आप ifstream का उपयोग कर पढ़ रहे थे तो आप char का उपयोग करेंगे, और इसी प्रकार char16_t और char32_t के लिए।

मान लिया जाये कि (उदाहरण करता है) कि wchar_t 32-बिट है, और कहा कि देशी चरित्र सेट है कि यह प्रतिनिधित्व करता है UTF-32 (यूसीएस -4), तो यह एक फ़ाइल के रूप में पढ़ने के लिए सबसे आसान तरीका है UTF-32; इसे यूटीएफ -16 के रूप में फ़ाइल पढ़ने के विपरीत उदाहरण के रूप में प्रस्तुत किया गया है। एक और पोर्टेबल विधि basic_ifstream<char32_t> और std::codecvt_utf8<char32_t> का स्पष्ट रूप से उपयोग करना होगा, क्योंकि यह यूटीएफ -8 इनपुट स्ट्रीम से यूटीएफ -32 तत्वों में कनवर्ट करने की गारंटी है।

+1

+1, मैंने लिखा कि उदाहरण और इसके विपरीत मैं क्या कर रहा था। – Cubbi

+0

आह मैं देखता हूँ! तो क्या यह हमेशा यूटीएफ -8 को व्यापक रूप से 'wchar_t' में परिवर्तित करने के लिए बेहतर अभ्यास है या क्या यह अभी भी कच्चे यूटीएफ -8 बाइट्स को' ifstream' का उपयोग करके देशी 'char' सरणी में निकालने के लिए स्वीकार्य है? मुझे यकीन नहीं है कि @ कब्बी के उदाहरण से अनुमान लगाया जाए कि बाद वाला बुरा अभ्यास है, या यह उदाहरण के दायरे से बाहर है या नहीं। – Ephemera

+0

@PLPiper हां आप किसी भी रूपांतरण को शामिल किए बिना फ़ाइल को चार सरणी में एन्कोडिंग करने वाले मल्टीबाइट एन्कोडिंग को हमेशा पढ़ सकते हैं। वहाँ एक बहुत है कि मानक सी ++ (विस्तृत पहले परिवर्तित करने के अलावा अन्य) के भीतर ऐसे सरणी के साथ किया जा सकता है नहीं है, लेकिन पुस्तकालयों के बहुत UTF8 आदानों ले। – Cubbi

2

cppreference कोड स्निपेट आप इस्तेमाल के विचार क्यों वे एक ofstream का उपयोग कर फ़ाइल लिखने कैसे एक UTF-16 स्ट्रिंग है कि में एक UTF-8 फ़ाइल को पढ़ने, लेकिन एक wifstream (इसलिए wchar_t) का उपयोग कर इसे पढ़ने के लिए दिखाने के लिए है ।

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