В стандарте нет определения того, как широкий символьный поток преобразуется в символьное устройство, и вам необходимо поэкспериментировать с вашей системой, чтобы выяснить, что происходит. Обычно установка локального через C должна работать для потоков ввода / вывода std std :: cin / std :: cout.
setlocale(""); // Loads the local that the machine is configured for (see you config)
// If it is not configured it default to the "C" locale
Объекты файлового потока не могут автоматически извлекать локальный, поэтому иногда стоит явно указать локальный поток.
std::locale defaultLocale(""); // from machine config
std::wfstream out;
out.imbue(defaultLocale); // imbue must be done before opening
// otherwise it is ignored.
out.open("/tmp/unicode.txt");
Давайте сделаем несколько тестов, чтобы убедиться, что вы действительно пишете:
if (!out)
{
std::cout << "Failed to open file\n";
}
В качестве примечания:
out.write(ws1.c_str(), ws1.size()); // size() is the number of characters (wide)
// write is expecting the number of bytes.
Другое примечание:
out.flush(); // flush() happens automatically when the file is closed
out.close(); // close() happens automatically when the stream is destroyed.
// So technically it is better not to use these
// as they are specific to file streams which will prevent you from
// easily replacing this with a generic stream