Что-то вроде:

могу прочитать файл Unicode (UTF-8) вwstringна платформе Windows?

 Abdelwahed23 янв. 2011 г., 19:11
UTF-8 на окнах
 dan0423 янв. 2011 г., 19:07
Под Unicode вы подразумеваете UTF-8 или UTF-16? А какую платформу вы используете?
 anno23 янв. 2011 г., 20:28
В Windows вы должны использовать std :: string для UTF-8 и std :: wstring для UTF-16.
 Nawaz23 янв. 2011 г., 19:25
Прочитайте эту статью:Чтение UTF-8 с потоками C ++
 Nawaz23 янв. 2011 г., 19:27
Еще одна хорошая статья:UTF-8 с C ++ в портативном виде

Ответы на вопрос(6)

#include <iostream>
#include <fstream>
#include <string>
#include <locale>
#include <cstdlib>

int main()
{
    std::wifstream wif("filename.txt");
    wif.imbue(std::locale("zh_CN.UTF-8"));

    std::wcout.imbue(std::locale("zh_CN.UTF-8"));
    std::wcout << wif.rdbuf();
}
 wp78de03 нояб. 2017 г., 07:43
Это мило. Но чем ваш ответ отличается от ответа @ LihO? Вы просто используете другую локаль, верно?
 Shen Yu03 нояб. 2017 г., 06:46
Недавно у меня возник вопрос, но сейчас я решил, хочу поделиться своим решением, чтобы помочь другим.
 wp78de03 нояб. 2017 г., 05:22
Здравствуй. Спасибо, что поделился. Оценил. Можете ли вы добавить немного больше контекста? Почему этот ответ на 6 лет вопросов. Благодарю.

size_t GetSizeOfFile(const std::wstring& path)
{
    struct _stat fileinfo;
    _wstat(path.c_str(), &fileinfo);
    return fileinfo.st_size;
}

std::wstring LoadUtf8FileToString(const std::wstring& filename)
{
    std::wstring buffer;            // stores file contents
    FILE* f = _wfopen(filename.c_str(), L"rtS, ccs=UTF-8");

    // Failed to open file
    if (f == NULL)
    {
        // ...handle some error...
        return buffer;
    }

    size_t filesize = GetSizeOfFile(filename);

    // Read entire file contents in to memory
    if (filesize > 0)
    {
        buffer.resize(filesize);
        size_t wchars_read = fread(&(buffer.front()), sizeof(wchar_t), filesize, f);
        buffer.resize(wchars_read);
        buffer.shrink_to_fit();
    }

    fclose(f);

    return buffer;
}

Используйте вот так:

std::wstring mytext = LoadUtf8FileToString(L"C:\\MyUtf8File.txt");

Обратите внимание, что весь файл загружен в память, поэтому вы можете не использовать его для очень больших файлов.

 AshleysBrain23 янв. 2011 г., 20:00
Спасибо, отредактировал ответ.
 AshleysBrain23 янв. 2011 г., 21:33
Ты уверен? То, как я интерпретировал документы, указавt в режиме, а такжеccs=UTF-8 вызывает преобразование символов по мере их чтения в поток и из потока.
 Hans Passant23 янв. 2011 г., 19:46
Также можно пройти весь путь: _wfopen (filename.c_str (), L "rt, ccs = UTF-8"); Конвертация теперь автоматическая.
 Hans Passant23 янв. 2011 г., 21:04
Только имя файла. Цитата:Simply using _wfopen has no effect on the coded character set used in the file stream.
 AshleysBrain23 янв. 2011 г., 20:04
Фактически, откатив его, в документах _wfopen говорится, что он автоматически конвертируется в широкие символы, и этот код не учитывает это.

но как насчет чтения файла в виде простых старых байтов и преобразования буфера байтов в wchar_t *?

Что-то вроде:

#include <iostream>
#include <fstream>
std::wstring ReadFileIntoWstring(const std::wstring& filepath)
{
    std::wstring wstr;
    std::ifstream file (filepath.c_str(), std::ios::in|std::ios::binary|std::ios::ate);
    size_t size = (size_t)file.tellg();
    file.seekg (0, std::ios::beg);
    char* buffer = new char [size];
    file.read (buffer, size);
    wstr = (wchar_t*)buffer;
    file.close();
    delete[] buffer;
    return wstr;
}

std :: codecvt_utf8 facet который инкапсулирует преобразование между байтовой строкой в ​​кодировке UTF-8 и символьной строкой UCS2 или UCS4 а такжекоторый может использоваться для чтения и записи файлов UTF-8, как текстовых, так и двоичных.

Для того, чтобы использоватьфаска вы обычно создаетеобъект локали он инкапсулирует специфическую для культуры информацию в виде набора аспектов, которые в совокупности определяют конкретную локализованную среду. Если у вас есть объект локали, вы можетенасыщать ваш поток буфера с ним:

#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>));
 Dmitri Nesteruk05 сент. 2016 г., 08:45
Это делаетnew codecvt_utf8 требуют соответствующегоdelete?
 MrTux14 окт. 2016 г., 18:00
Нет необходимости явно удалять codecvt_utf8. Это делается в деструкторе std :: locale, когда refcounter codecvt_utf8 становится равным нулю (см.en.cppreference.com/w/cpp/locale/locale/%7Elocale)

самый простой способ заключается в использовании_wfopen_s, Откройте файл с режимомrt, ccs=UTF-8.

Вот еще одно чистое решение C ++, которое работает по крайней мере с VC ++ 2010:

#include <locale>
#include <codecvt>
#include <string>
#include <fstream>
#include <cstdlib>

int main() {
    const std::locale empty_locale = std::locale::empty();
    typedef std::codecvt_utf8<wchar_t> converter_type;
    const converter_type* converter = new converter_type;
    const std::locale utf8_locale = std::locale(empty_locale, converter);
    std::wifstream stream(L"test.txt");
    stream.imbue(utf8_locale);
    std::wstring line;
    std::getline(stream, line);
    std::system("pause");
}

За исключениемlocale::empty() (Вотlocale::global() может работать так же) иwchar_t* перегрузкаbasic_ifstream конструктор, это должно быть даже вполне совместимым со стандартом (где «стандарт» означает, конечно, C ++ 0x).

 Mikhail28 сент. 2013 г., 21:34
Почему ты неdelete converter?
 W.M.30 авг. 2016 г., 23:02
Это читает только первую строку файла ..
 sven29 июл. 2015 г., 20:17
«Перегрузка 7 обычно вызывается со вторым аргументом f, полученным непосредственно из выражения new: локаль отвечает за вызов соответствующего удаления из своего деструктора».ссылка
 adprocas25 сент. 2016 г., 05:55
Это хорошо работает. Любопытно, так как я не могу найти много информации об этом, и моя прекрасно работает без нее, что конкретно делает stream.imbue? Кажется, что он устанавливает какой-то тип по умолчанию, но нужно ли это? Кроме того, для примечания в первой строке поместите вашу строку getline в цикл while (getline (stream, line)), чтобы увидеть больше, чем первая строка.

Запутался в std :: wstring, UTF-16, UTF-8 в C ++ и отображении строк в графическом интерфейсе Windows, В итоге, wstring основана на стандарте UCS-2, который является предшественником UTF-16. Это строго двухбайтовый стандарт. Я считаю, что это охватывает арабский язык.

 David Heffernan23 янв. 2011 г., 21:24
@Thomas все, что с определенной кодовой точкой Unicode может быть представлено в UTF-16
 David Heffernan23 янв. 2011 г., 21:25
@ Филипп консоли - это целый мир боли! Даже отображение не кодовых точек ANSI является упражнением в крайнем мазохизме!
 Philipp23 янв. 2011 г., 21:08
@ Дэвид: Технически,wstring это просто массив 16-битных целых чисел в Windows. Вы можете хранить в нем данные UCS-2 или UTF-16 или что угодно. Большинство API Windows в настоящее время принимают строки UTF-16.
 David Heffernan23 янв. 2011 г., 20:02
Я думаю, что вы можете использовать wstring с UTF-16
 David Heffernan23 янв. 2011 г., 21:36
@ Филипп Очень интересно! Я привык к Python на Windows, которая поддерживает мусорную консоль.

Ваш ответ на вопрос