Portable Unicode QT Boost
Standard C++
std::string is byte-oriented encoding-unaware container. iostream library uses underlying C stdio library which means that on Windows local single-byte encoding will be used.
QT Unicode
Internally QT uses UTF-16 encoding. Default conversions from char * (and QString::fromStdString()) assumed to be from local single-byte encoding, not UTF-8 -- QString::fromUtf8() should be used instead.
Boost
bfs::path (boost::filesystem::path) uses native platform encoding until being imbued with different locale. It means by default on Windows UTF-16 is used while UTF-8 on Unix-based platforms. boost::locale::generator.generate("") creates UTF-8 environment and should be fed to bfs::path::imbue() on application setup on Windows. boost::iostreams are allowed to take bfs::path instead of string filename (Note: beware of most-vexing parse error, enclose bfs::path argument in additional pair of parentheses while constructing boost::fstream).
OpenMW
Historically OpenMW assumes UTF-8 encoding.
CLI tools
Entry point main(int, char **) on Windows is strongly for local single-byte encoding, no way to pass Unicode. Therefore, wmain(int, wchar_t **) should be ifdefed for this purpose and wchar_t which is UTF-16 should be converted to UTF-8 before passing to any OpenMW interface.