Обнаружение и чтение всего файла UTF-8 с помощью C 11?

#c #utf-8 #fstream

#c #utf-8 #fstream

Вопрос:

Я знаю об этом традиционном способе,

 #include <fstream>
#include <string>
#include <cerrno>
#include <iostream>

int main()
{
    std::ifstream in("file.txt", std::ios::in | std::ios::binary);

    if (in)
    {
        std::string contents;
        in.seekg(0, std::ios::end);
        contents.resize((size_t)in.tellg()); // Allocate buffer
        in.seekg(0, std::ios::beg);

        // Read the file
        in.read(amp;contents[0], contents.size());

        // ... do something ..

        // Close
        in.close();
    }
    else
        throw(errno);
}
  

Чтобы определить, является ли его ANSI или UTF-8 файлом, нужно ли мне прочитать первые три байта, чтобы проверить, соответствует ли спецификация, или есть лучший способ C 11 с использованием codecvt? Как я могу заставить этот способ codecvt работать для всего файла?

Комментарии:

1. do I need to read first three bytes to check if BOM matches Большинство файлов UTF-8 не имеют спецификации.

2. Давайте предположим, что все мои utf-8 сохранены с помощью BOM, а некоторые — ANSI.

3. Вы ссылаетесь на справочную страницу std::codecvt , поэтому вам доступны ее полные спецификации. Вы должны быть в состоянии выяснить, будут ли его средства работать для вашего варианта использования, или вам придется определить это самостоятельно. Каков ваш конкретный вопрос? Проблема здесь в том, что если вы спросите трех разработчиков C «какой лучший способ C 11 сделать X», вы получите четыре разных ответа. Это то, что вам нужно решить для себя, исходя из ваших конкретных требований.

4. Если бы каждый мог разобраться в этом самостоятельно, не было бы смысла иметь этот сайт вопросов и ответов. Как я уже сказал, я хочу прочитать весь файл целиком, и я не уверен, как работает метод std ::codecvt. Они используют a wchar_t , и я не уверен, почему.

5. Если вы априори знаете, что ваши файлы являются либо ANSI, либо UTF-8 со спецификацией, то проверки первых 3 байтов будет достаточно.