Я много пытаюсь сделать то, что выглядит просто: записывая содержимое в std:: wstring на диск. Предположим, у меня есть следующая строка, которую я хочу записать в текстовый файл:
std::wstring s = L"输入法."; // random characters pulled from baidu.cn
- Использование
std::utf8_codecvt
или повышение языкового стандарта
Вот код, который я использовал:
std::wofstream out(destination.wstring(), std::ios_base::out | std::ios_base::app);
const std::locale utf8_locale = std::locale(std::locale(), new boost::locale::utf8_codecvt<wchar_t>());
out.imbue(utf8_locale);
// Verify that the file opened correctly
out << s << std::endl;
Это отлично работает в Windows, но, к сожалению, я скомпилировал его в Linux: utf8_codecvt
пока недоступен в компиляторах с обычными дистрибутивами, а Boost: Locale включен только в Boost 1.60.0, который снова версия, которая слишком поздняя для репозиториев дистрибутивов. Не устанавливая язык, ничего не записывается в файл (в обеих системах).
- С fwrite
Следующая попытка:
FILE* out = fopen("test.txt", "a+,ccs=UTF-8");
fwrite(s.c_str(), wcslen(s.c_str()) * sizeof(wchar_t), 1, out);
fclose(out);
Это работает в Windows, но ничего не записывает в файл в Linux. Я также попытался открыть файл в двоичном режиме, но это ничего не изменило. Не устанавливая часть ccs
, в файл записывается неразборчивый мусор.
Мне явно не хватает чего-то здесь: как правильно записать эту строку в файл?