Разберитесь сначала с кодировками, в винда очень любит UTF-16 (на самом деле UCS-2), тогда как posix системы UTF-8. UTF-8 по сути хранится в обычном char, это multi byte кодировка, размер символа плавающий от 1 до 4 байт, работать с этими строками сложнее. UTF-16 это всегда 2х байтная кодировка, хранится в wchar_t. В итоге с UTF-8 используются все те же методы записи, что и для обычного ANSI (std::ofstream), вообще если не требуется посимвольная работа, то подходят все методы ANSI. Тогда как для UTF-16 используются свои методы, объекты (std::wofstream). Ну и их наследники. В скобках указал потоки, которыми можно сохранить.