2011-02-17 16 views
10

मैं ut8 पाठ फ़ाइल है, कि im पढ़ने सरल का उपयोग करते हुए:C++ कैसे लिखने के लिए/यूनिकोड में ofstream पढ़ने/UTF8

ifstream in("test.txt"); 

अब मैं यूनिकोड कैसे नई फ़ाइल कि ut8 एन्कोडिंग या हो डब्ल्यूएलएल बनाना चाहते कर सकते हैं मैं इसे स्ट्रीमस्ट्रीम या अन्य के साथ करता हूं? यह मुझे ansi एन्कोडिंग बनाता है।

ofstream out(fileName.c_str(), ios::out | ios::app | ios::binary); 
+0

क्या आप मतलब है UTF8 यूनिकोड नहीं है? –

+0

कृपया आपके द्वारा लिखे गए व्यवहार को प्रदर्शित करने वाला एक न्यूनतम लेकिन पूरा कोड नमूना शामिल करें। –

+0

@ जोर्जन - यूनिकोड को कई प्रारूपों में एन्कोड किया जा सकता है, जिनमें से यूटीएफ -8 केवल एक है। यूटीएफ -16 एन्कोडेड यूनिकोड उतना ही यूनिकोड है जितना यूटीएफ -8 एन्कोडेड यूनिकोड है, उदाहरण के लिए, लेकिन इसे यूटीएफ -8 के रूप में पार्स करने की कोशिश करना आपके डिकोडर को क्रैश और जला देना संभव है। तो, यूनिकोड चरित्र तालिका के किस एन्कोडिंग के बारे में बात करने के बारे में स्पष्ट होना बेहतर है। –

उत्तर

5

ठीक है, पोर्टेबल संस्करण के बारे में। यह आसान है, अगर आप C++11 मानक का उपयोग करते हैं (क्योंकि "utf8" जैसे कई अतिरिक्त अतिरिक्त शामिल हैं, जो इस समस्या को हमेशा हल करता है)।

लेकिन आप पुराने मानकों के साथ मल्टी-प्लैटफार्म कोड का उपयोग करना चाहते हैं, तो आप धाराओं के साथ लिखने के लिए इस विधि का उपयोग कर सकते हैं:

  1. Read the article about UTF converter for streams
  2. ऊपर स्रोतों से अपनी परियोजना के लिए stxutif.h जोड़े फ़ाइल को एएनएसआई मोड में खोलें और फ़ाइल की शुरुआत में बीओएम जोड़ें, जैसे:

    std::ofstream fs; 
    fs.open(filepath, std::ios::out|std::ios::binary); 
    
    unsigned char smarker[3]; 
    smarker[0] = 0xEF; 
    smarker[1] = 0xBB; 
    smarker[2] = 0xBF; 
    
    fs << smarker; 
    fs.close(); 
    
  3. फिर UTF के रूप में फ़ाइल को खोलने और आपकी सामग्री लिखें:

    std::wofstream fs; 
    fs.open(filepath, std::ios::out|std::ios::app); 
    
    std::locale utf8_locale(std::locale(), new utf8cvt<false>); 
    fs.imbue(utf8_locale); 
    
    fs << .. // Write anything you want... 
    
+0

क्या आप कृपया बता सकते हैं कि किस बिंदु 3 के लिए खड़ा है? – ravwojdyla

+0

फ़ाइल को सही प्रारूप में सहेजना। –

+0

"यूसीएस -2 और यूटीएफ -16 एन्कोडिंग टेक्स्ट फ़ाइलों की शुरुआत में उपयोग के लिए यूनिकोड बाइट ऑर्डर मार्क (बीओएम) निर्दिष्ट करते हैं, जिसका उपयोग बाइट ऑर्डरिंग डिटेक्शन (या बाइट एंडियननेस डिटेक्शन) के लिए किया जा सकता है।" - http: // en.wikipedia.org/wiki/Byte_order_mark –

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