В С++ есть
codecvt для конфертации между кодировками.
С помощью его можно читать файлы в utf_8, например, так:
std::ifstream f("file.txt");
std::wbuffer_convert<std::codecvt_utf8<wchar_t>> conv(f.rdbuf());
std::wistream wf(&conv);
Потом читаете из wistream, как будто это обычный cin. Только вместо char нужен wchar_t, а вместо string - wstring.