Динамически определять кодировку файла в C++
Я пытаюсь прочитать файл, который может иметь какой-либо кодировку / codePage, но я не могу указать какой языковой стандарт для правильного чтения файла.
Ниже приведен мой фрагмент кода, в котором я пытаюсь прочитать файл с набором символов в виде windows-1256, но я хочу получить набор символов динамически из файла, который читается, чтобы я мог соответственно установить локаль.
std::wifstream input{ filename.c_str() };
std::wstring content{ std::istreambuf_iterator<wchar_t>(input1), std::istreambuf_iterator<wchar_t>() };
input.imbue(std::locale(".1256"));
contents = ws2s(content); // Convert wstring to CString
2 ответа
В общем, это невозможно сделать точно, используя только содержимое простого текстового файла. Обычно вы должны полагаться на некоторую внешнюю информацию. Например, если файл был загружен по протоколу HTTP, кодировка должна быть получена в заголовке ответа.
Некоторые файлы могут содержать информацию о кодировке в соответствии с форматом файла. XML например: <?xml version="1.0" encoding="XXX"?>
,
Кодировки Unicode могут быть обнаружены, если файл начинается с метки порядка байтов, что является необязательным.
Обычно можно предположить, что в кодировке используется широкий символ, если файл содержит нулевой байт - который будет представлять ограничитель строки в виде узкого символа - перед концом файла. Аналогично, если вы найдете два последовательных нуля, выровненных по 2-байтовой границе (до конца), то кодирование, вероятно, будет шириной 4 байта.
Кроме этого, вы можете попытаться угадать кодировку на основе частоты определенных символов. Это может иметь некоторые непредвиденные последствия.
Позволь мне быть тупым и сказать: ты не можешь
Позвольте мне уточнить это: файл - это просто тонны нулей и единиц, которые застряли на вашем диске. Кодировка - это способ интерпретировать эти 0 и 1. Вы должны предоставить информацию о том, как их интерпретировать, а именно, указав кодировку.
Типичный способ сделать это - написать заголовок, чтобы указать кодировку.
Это заголовок HTML
<head>
<title>Page Title</title>
<meta charset="UTF-8">
</head>
Как видите, кодировка должна быть указана так или иначе.
Время от времени вы видите, что какое-то мошенническое приложение угадывает кодировку, они часто делают это с некоторой эвристикой по распределению байтов, но это ненадежно и часто приводит к бреду.
Как примечание, попробуйте использовать UTF-8 везде, остальные, мягко говоря, грязные.