С поддержкой C ++ 11 вы можете использовать std :: codecvt_utf8 facet , который инкапсулирует преобразование между строкой байтов в кодировке UTF-8 и строкой символов UCS2 или UCS4 и который может использоваться для чтения и записи файлов UTF-8, как текстовых, так и двоичных.
Чтобы использовать facet , вы обычно создаете объект локали , которая инкапсулирует специфическую для культуры информацию в виде набора аспектов, которые совместно определяют конкретную локализованную среду. Получив объект языкового стандарта, вы можете наполнить буфер потока с ним:
#include <sstream>
#include <fstream>
#include <codecvt>
std::wstring readFile(const char* filename)
{
std::wifstream wif(filename);
wif.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
std::wstringstream wss;
wss << wif.rdbuf();
return wss.str();
}
, который можно использовать следующим образом:
std::wstring wstr = readFile("a.txt");
В качестве альтернативы вы можете установить глобальный языковой стандарт C ++ , прежде чем работать со строковыми потоками, которые вызывают все будущие вызовыв конструктор std::locale
по умолчанию, чтобы вернуть копию глобальной локали C ++ (тогда вам не нужно явно загружать потоковые буферы):
std::locale::global(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));