#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 байтов будет достаточно.