Динамически определять кодировку файла в 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 везде, остальные, мягко говоря, грязные.

Другие вопросы по тегам