Wrote to a file using std::wofstream. The file remained empty Wrote to a file using std::wofstream. The file remained empty windows windows

Wrote to a file using std::wofstream. The file remained empty


MSVC offers the codecvt_utf8 locale facet for this problem.

#include <codecvt>// ...  std::wofstream fout(fileName);std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);fout.imbue(loc);


In Visual studio the output stream is always written in ANSI encoding, and it does not support UTF-8 output.

What is basically need to do is to create a locale class, install into it UTF-8 facet and then imbue it to the fstream.

What happens that code points are not being converted to UTF encoding. So basically this would not work under MSVC as it does not support UTF-8.

This would work under Linux with UTF-8 locale

#include <fstream>int main(){    std::locale::global(std::locale(""));    std::wofstream fout("myfile");    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;}

~And under windows this would work:

#include <fstream>int main(){    std::locale::global(std::locale("Russian_Russia"));    std::wofstream fout("myfile");    fout << L"Россия" << std::endl;}

As only ANSI encodings are supported by MSVC.

Codecvt facet can be found in some Boost libraries. For example: http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html


I found the following code working properly. I am using VS2019.

#include <iostream>#include <fstream>#include <codecvt>int main(){    std::wstring str = L"abàdëef€hhhhhhhµa";    std::wofstream fout(L"C:\\app.log.txt", ios_base::app); //change this to ios_base::in or ios_base::out as per relevance    std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);    fout.imbue(loc);    fout << str;    fout.close();}