2011-01-24 15 views
18

में यूटीएफ -8 फ़ाइल बनाएं मैं क्यूटी में एक यूटीएफ -8 कोडित फ़ाइल बनाने की कोशिश कर रहा हूं।क्यूटी

#include <QtCore> 

int main() 
{ 
    QString unicodeString = "Some Unicode string"; 
    QFile fileOut("D:\\Temp\\qt_unicode.txt"); 
    if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text)) 
    { 
     return -1; 
    } 

    QTextStream streamFileOut(&fileOut); 
    streamFileOut.setCodec("UTF-8"); 
    streamFileOut << unicodeString; 
    streamFileOut.flush(); 

    fileOut.close(); 

    return 0; 
} 

मैंने सोचा था कि जब QString डिफ़ॉल्ट यूनिकोड के द्वारा होता है और जब मैं UTF-8 में उत्पादन धारा के कोडेक सेट मेरी फाइल को UTF-8 होगा। लेकिन ऐसा नहीं है, यह एएनएसआई है। मैं गलत क्या करूँ? क्या मेरे तारों में कुछ गड़बड़ है? क्या आप यूटीएफ -8 फाइल बनाने के लिए अपना कोड सही कर सकते हैं? मेरे लिए अगला चरण एएनएसआई फ़ाइल को पढ़ना होगा और इसे यूटीएफ -8 फ़ाइल के रूप में सहेजना होगा, इसलिए मुझे प्रत्येक पठन स्ट्रिंग पर रूपांतरण करना होगा, लेकिन अब, मैं एक फाइल से शुरू करना चाहता हूं। धन्यवाद।

+1

आपको स्ट्रिंग अक्षर को QString :: fromUtf8() से स्ट्रिंग में परिवर्तित करना चाहिए। इसके अलावा, कुछ कंपाइलरों में स्रोत फ़ाइलों (एमएसवीसी) में गैर-एसीआई एन्कोडिंग के साथ समस्याएं होती हैं।तो हो सकता है कि स्ट्रिंग में प्रवेश करते समय यह काम करता है या नहीं QInputDialog। मैं इस तरह के मुद्दों का सामना करते समय QT_NO_CAST_FROM_ASCII और QT_NO_CAST_TO_ASCII को परिभाषित करने का भी सुझाव देता हूं। यह निहित रूपांतरण अक्षम करता है और इस प्रकार यह स्पष्ट करता है कि क्या हो रहा है। –

+0

http://stackoverflow.com/questions/29485602/qt-convert-unicode-entites – trante

उत्तर

16

आपका कोड बिल्कुल सही है।

QString unicodeString = "Some Unicode string"; 

आपको पता है, कि तुम सिर्फ उद्धरण में एक यूनिकोड स्ट्रिंग नहीं डाल सकते हैं, आप कार्य करें: केवल बात यह है कि मेरे लिए संदिग्ध लग रहा है है? डिफ़ॉल्ट रूप से QString लेटिन 1 का उपयोग करता है, इसलिए यदि यह सिर्फ के बारे में स्वराघात वर्ण, तो आप शायद ठीक हो, लेकिन बेहतर अपने स्रोत UTF-8 में एन्कोड और ऐसा करने के लिए:

QString unicodeString = QString::fromUtf8("Some Unicode string"); 

यह किसी भी कल्पनीय भाषा के लिए काम करेंगे। QObject :: trUtf8() का उपयोग करना भी बेहतर है क्योंकि यह आपको i18n क्षमताओं की बहुत सारी सुविधाएं देता है।

संपादित

हालांकि यह सच है कि आप एक सही UTF-8 फाइल उत्पन्न, अगर आप UTF-8 के रूप में अपनी फ़ाइल पहचान करने के लिए नोटपैड चाहते हैं, यह एक अलग कहानी है। आपको वहां एक बीओएम लगाने की जरूरत है। यह या तो किया जा सकता है के रूप में एक और जवाब में सुझाव दिया, या यहाँ एक और तरीका है:

streamFileOut.setGenerateByteOrderMark(true); 
+1

मैं यूटीएफ -8 में सी ++ स्रोत रखने की अनुशंसा नहीं करता :) –

+1

@Piotr, क्यों? यूटीएफ -8 (बिना बीओएम के साथ) एक एन्कोडिंग है जो यूएस-एएससीआईआईआई के साथ पूरी तरह से संगत है और किसी भी भाषा का समर्थन करता है। QTextStream :: setCodecForCStrings() का उपयोग किए बिना, आप कुछ देशी भाषा में चरित्र अक्षर का और कैसे उपयोग कर सकते हैं जो पूरी तरह से समस्याओं का कारण बन सकता है? –

+0

@ सर्गी। मुझे पियेटर से सहमत होना है। समस्या तब होती है जब आपके पास स्रोत फ़ाइल में गैर-ASCII अक्षर होते हैं, यह पूर्व-प्रोसेसर और कंपाइलर्स की दया पर निर्भर करता है ताकि उन्हें उलझाने की कोशिश न हो। मुझे कोई संदेह नहीं है कि अधिकांश आधुनिक उपकरण इसे संभाल सकते हैं। लेकिन इसे मौका क्यों छोड़ दें? –

5

भूलें कि UTF-8 एन्कोडिंग ASCII वर्णों को एक बाइट के रूप में एन्कोड करेगा। केवल विशेष या accentuated वर्णों को अधिक बाइट्स (2 से 6 बाइट्स) के साथ एन्कोड किया जाएगा।

इसका मतलब है कि आपके पास ASCII वर्ण हैं (जो आपके unicodeString का मामला है), फ़ाइल में केवल 8 बाइट वर्ण होंगे। इस प्रकार, आप ASCII साथ पश्चगामी संगतता मिलती है:

UTF-8 यूनिकोड वर्ण सेट के प्रत्येक वर्ण का प्रतिनिधित्व कर सकते हैं, लेकिन उन्हें विपरीत,

जाँच करने के लिए ASCII साथ पार्श्व-संगत किया जा रहा है के फायदे के पास यदि आपका कोड काम कर रहा है, तो आपको उदाहरण के लिए अपने यूनिकोड में कुछ accentuated वर्ण डाल देना चाहिए।

मैंने आपके कोड को accentuated वर्णों के साथ परीक्षण किया, और यह ठीक काम कर रहा है।

यदि आप अपनी फ़ाइल की शुरुआत में BOM रखना चाहते हैं, तो आप बीओएम चरित्र (QChar(QChar::ByteOrderMark)) जोड़कर शुरू कर सकते हैं।

+0

धन्यवाद जेरोम, आपने मुझे बीओएम के साथ मदद की। फ़ाइल वास्तव में ठीक थी, लेकिन बीओएम गुम था। मैं स्ट्रीम में इसे जोड़ने के लिए सर्गेई के तरीके का उपयोग करता हूं, लेकिन आपकी मदद की बहुत सराहना की जाती है। –

7

मेरे अनुभव के रूप में क्यूटी द्वारा txt एन्कोडिंग UTF-8 बीओएम बिना बनाने के लिए:

file.open(QIODevice::WriteOnly | QIODevice::Text); 
QTextStream out(&file); 
out.setCodec("UTF-8"); // ... 
vcfline = ctn; //assign some utf-8 characters 
out.setGenerateByteOrderMark(false); 
out << vcfline; //..... 
file.close(); 

और फ़ाइल होगा बीओएम के बिना यूटीएफ -8 एन्कोडिंग हो।

+0

यदि आप किसी फ़ाइल से पढ़ते हैं, तो इनपुट और आउटपुट फ़ाइल स्ट्रीम दोनों के लिए कोडेक सेट करें। –