UTF-8, CString und CFile? (C++, MFC)

Derzeit arbeite ich auf einem MFC-Programm, das speziell arbeiten mit UTF-8. Irgendwann, ich habe das schreiben von UTF-8 Daten in einer Datei; das zu tun, ich bin mit CFiles und CStrings.

Wenn ich Schreibe utf-8 (Russisch Charaktere, um genauer zu sein) Daten in eine Datei, die Ausgabe sieht so aus

Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî

usw. Dies ist assurely nicht utf-8. Um diese Daten Lesen richtig, ich meine Systemeinstellungen ändern, die nicht-ASCII-Zeichen eines Russischen Codierung Tabelle funktioniert, aber dann sind alle meine Latein-basierten, nicht-ascii-Zeichen bekommen, zu scheitern.
Es ist jedenfalls wie ich es mache.

CFile CSVFile( m_sCible, CFile::modeCreate|CFile::modeWrite);
CString sWorkingLine;
//Add stuff into sWorkingline
CSVFile.Write(sWorkingLine,sWorkingLine.GetLength());
//Clean sWorkingline and start over

Bin ich etwas fehlt? Soll ich stattdessen etwas anderes? Ist es eine Art fangen, die ich verpasst habe?
Ich werde abgestimmt, für Ihre Weisheit und Erfahrung, Kolleginnen und Programmierer.

BEARBEITEN:
Natürlich, als ich nur eine Frage gestellt wird, finde ich schließlich etwas, das interessant sein könnte, gefunden werden kann hier. Dachte, ich könnte es teilen.

EDIT 2:

Okay, also ich habe die Stückliste, um meine Datei, die enthält jetzt chineese Charakter, wahrscheinlich, weil ich nicht konvertieren meiner Zeile auf UTF-8. Fügen Sie die Stückliste habe ich...

char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);

Und danach habe ich Hinzugefügt...

    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);

Aber dann kann ich nicht kompilieren, da ich nicht wirklich weiß, wie man die Länge der TestLine. strlen scheint nicht zu akzeptieren, TCHAR.
Feste, verwendet eine statische Länge von 1000 statt.

EDIT 3:

So, ich habe diesen code...

    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);

Kompiliert er fein, aber wenn ich Blick auf meine neue Datei, es ist genau das gleiche wie wenn ich didn ' T haben alle dieser neuen code (ex : Ðàñïå÷àòàíî:). Es fühlt sich wie ich nicht einen Schritt nach vorne, obwohl ich denke, nur eine kleine Sache ist, was trennt mich vom Sieg.

EDIT 4:

Habe ich entfernt, die Sie zuvor Hinzugefügt code, als Nate Sie gefragt, und ich habe mich entschieden, seinen code statt, was bedeutet, dass jetzt, wenn ich zur Beurteilung meiner Linie, die ich habe...

        CT2CA outputString(sWorkingLine, CP_UTF8);

    //Add line to file.
    CSVFile.Write(outputString,::strlen(outputString));

Alles kompiliert in Ordnung, aber die Russischen Zeichen werden angezeigt ???????. Näher, aber immer noch nicht.
Btw, ich möchte allen danken, die versucht/versucht mir zu helfen, es ist SEHR geschätzt. Ich Hänge schon länger an diesem für eine Weile jetzt, ich kann nicht warten, für dieses problem gegangen zu sein.

FINAL EDIT (hoffe ich)
Durch die änderung der Art habe ich zum ersten mal meine UTF-8-Zeichen (ich neu kodiert, ohne Sie wirklich zu kennen), die fehlerhaft sind, die mit meinem neuen Weg, der die Ausgabe von dem text, ich habe akzeptable Ergebnisse. Indem die UTF-8-BOM char am Anfang meiner Datei, es könnte gelesen werden als Unicode in andere Programme wie Excel.

Hurra! Danke an alle!

InformationsquelleAutor der Frage | 

Schreibe einen Kommentar