मैं वर्तमान में एक एमएफसी प्रोग्राम पर काम कर रहा हूं जिसे विशेष रूप से यूटीएफ -8 के साथ काम करना है। किसी बिंदु पर, मुझे एक फ़ाइल में यूटीएफ -8 डेटा लिखना है; ऐसा करने के लिए, मैं CFiles और CStrings का उपयोग कर रहा हूँ।यूटीएफ -8, सीएसटींग और सीएफआईएल? (सी ++, एमएफसी)
जब मैं एक फ़ाइल में UTF-8 डेटा लिखने के लिए (रूसी वर्ण, और अधिक सटीक होना करने के लिए) मिलता है, उत्पादन की तरह
Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî
लग रहा है और आदि इस assurely utf-8 नहीं है। इस डेटा को सही तरीके से पढ़ने के लिए, मुझे अपनी सिस्टम सेटिंग्स बदलनी है; रूसी एन्कोडिंग तालिका में गैर ASCII वर्णों को बदलना काम करता है, लेकिन फिर मेरे सभी लैटिन आधारित गैर-असीसी वर्ण विफल हो जाते हैं। वैसे भी, मैं यह कैसे करता हूं।
CFile CSVFile(m_sCible, CFile::modeCreate|CFile::modeWrite);
CString sWorkingLine;
//Add stuff into sWorkingline
CSVFile.Write(sWorkingLine,sWorkingLine.GetLength());
//Clean sWorkingline and start over
क्या मुझे कुछ याद आ रही है? क्या मैं इसके बजाय कुछ और उपयोग करूँगा? क्या मुझे कुछ तरह का कैच याद आया है? मैं आपके ज्ञान और अनुभव, साथी प्रोग्रामर के लिए ट्यून किया जाएगा।
संपादित करें: बेशक, जैसा कि मैंने अभी एक प्रश्न पूछा है, मुझे अंततः कुछ दिलचस्प लगता है, जो here पाया जा सकता है। सोचा कि मैं इसे साझा कर सकता हूं।
संपादित करें 2:
ठीक है, तो मैं, मेरी फाइल है, जो अब chineese वर्ण को बीओएम जोड़ा शायद इसलिए क्योंकि मैं UTF-8 में मेरी लाइन में परिवर्तित नहीं किया। bom मैंने किया था ...
char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);
और उसके बाद, मैं जोड़ा ...
TCHAR TestLine;
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,sWorkingLine,sWorkingLine.GetLength(),TestLine,strlen(TestLine)+1,NULL,NULL);
//Add the line to file.
CSVFile.Write(TestLine,strlen(TestLine)+1);
को जोड़ने के लिए लेकिन फिर मैं संकलन नहीं कर सकते हैं, के रूप में मैं वास्तव में प्राप्त करने के लिए पता नहीं कैसे टेस्टलाइन की लंबाई। स्ट्रेल टीसीएचएआर स्वीकार नहीं कर रहा है। फिक्स्ड, इसके बजाय 1000 की एक स्थिर लंबाई का उपयोग किया।
संपादित करें 3:
तो, मैं इस कोड को ... जोड़ा
wchar_t NewLine[1000];
wcscpy(NewLine, CT2CW((LPCTSTR) sWorkingLine));
TCHAR* TCHARBuf = new TCHAR[1000];
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,NewLine,1000,TCHARBuf,1000,NULL,NULL);
//Find how many characters we have to add
size_t size = 0;
HRESULT hr = StringCchLength(TCHARBuf, MAX_PATH, &size);
//Add the line to the file
CSVFile.Write(TCHARBuf,size);
यह ठीक संकलित है, लेकिन जब मैं अपने नए फ़ाइल पर नज़र जाना है, यह के रूप में जब मैं नहीं था बिल्कुल वैसा ही है ' यह सब नया कोड नहीं है (उदा: Ðàñïå ÷ àòàíî :)। ऐसा लगता है जैसे मैंने एक कदम आगे नहीं किया, हालांकि मुझे लगता है कि केवल एक छोटी सी चीज़ मुझे जीत से अलग करती है।
संपादित करें 4:
मैं पहले, कोड जोड़ा हटाया के रूप में नैट पूछा, और मैं जिसका अर्थ है कि अब, जब मैं अपने पंक्ति जोड़ने के लिए मिलता है, मैं बजाय अपने कोड का उपयोग करने का फैसला किया, ...
CT2CA outputString(sWorkingLine, CP_UTF8);
//Add line to file.
CSVFile.Write(outputString,::strlen(outputString));
सबकुछ ठीक से संकलित करता है, लेकिन रूसी वर्णों को ??????? के रूप में दिखाया जाता है। करीब आना, लेकिन अभी भी नहीं। बीटीडब्ल्यू, मैं उन सभी को धन्यवाद देना चाहता हूं जिन्होंने मेरी मदद करने की कोशिश की/कोशिश की, यह बहुत सराहना की है। मैं थोड़ी देर के लिए इस पर अटक गया हूं, मैं इस समस्या को समाप्त होने की प्रतीक्षा नहीं कर सकता।
अंतिम संपादन (मुझे आशा है) तरह से मैं पहली बार मिला है मेरी UTF-8 वर्णों (मैं वास्तव में जानने के बिना reencoded) है, जो पाठ outputting के अपने नए तरीके के साथ गलत था, मैं स्वीकार्य परिणाम मिल गया बदल कर।मेरी फ़ाइल की शुरुआत में यूटीएफ -8 बीओएम चार जोड़कर, इसे एक्सेल जैसे अन्य प्रोग्राम्स में यूनिकोड के रूप में पढ़ा जा सकता है।
Hurray! आप सभी को धन्यवाद!
आपको एक टीसीएचएआर स्ट्रिंग की लंबाई प्राप्त करने के लिए _tcslen का उपयोग करने की आवश्यकता होगी। पसंद: \t टीसीएचएआर * testTCHAR = _T ("परीक्षण"); \t int tcharLength = _tcslen (testTCHAR); –
यदि आपको CSTring को TCHAR * स्ट्रिंग में कनवर्ट करने की आवश्यकता है, तो यह \t CSTring testCString = _T ("test") को आजमाएं; \t टीसीएचएआर * testTCHAR = testCString.GetBuffer(); –
आप बहुत मेहनत कर रहे हैं। 'CP_UTF8' के दूसरे पैरामीटर के साथ' CT2CA' का उपयोग करें। नीचे मेरी पोस्ट देखें। – Nate