2012-12-19 24 views
5

Ich habe ein Problem mit Multibyte Zeichenfolgen.Ausgabe Multibyte Zeichenfolge in C++

std::wstring str = L"multıbyte test string"; 
std::wofstream f; 
f.open("F:\\dump.txt"); 
f << str; 
f.close(); 

und die Dump-Datei Inhalt ist: Ich habe mein Problem wie unten vereinfacht "mult"

Warum es den verbleibenden Teil des str schneidet altough i wstring verwendet haben und wofstream?

Dank

+1

Einige Fragen: Wie groß sagt Ihr Betriebssystem, dass die Dump-Datei ist? Wie haben Sie den Inhalt der Dump-Datei überprüft? –

+0

Könnte das Zeichen 'ı' in 'multibyte' irgendein Problem verursachen? – iikkoo

Antwort

1

wofstream schreibt Daten aus den aktuellen locale verwenden. Das Standardgebietsschema unterstützt die Multibyte-Zeichen wahrscheinlich nicht.

Siehe Frage: Unable to write a std::wstring into wofstream

Sie können es zur Ausgabe von der vollständigen Zeichenfolge erhalten:

std::locale::global(std::locale("")); 

vor dem Schreiben, aber Sie werden nicht die Zeichen als Unicode auf Fenster bekommen, da es doesn t unterstützt UTF-8-Locales nativ.

Um dies zu tun, sollten Sie es in eine Std :: String unter Verwendung WideCharToMultiByte konvertieren, und schreiben Sie es mit regulären ofstream.

0

Sie müssen den Ausgangsstrom mit einer gewissen locale einzuflößen eine vernünftige codecvt Facette zu bekommen wchar_t zu char Umwandlung zu tun. Wenn Sie C++ haben 11 unterstützt Compiler oder Visual Studio 2010 und höher können Sie UTF-8 Facette (codecvt_utf8) verwenden:

f.imbue(
    std::locale (  // using std::locale constructed from 
     std::locale(), // global locale 
          // and codecvt_utf8 facet 
      new std::codecvt_utf8<char, 0x10FFFF, 
       static_cast<std::codecvt_mode>(std::consume_header 
        | std::little_endian)>); 

Es gibt auch codecvt_utf16.