Несколько баллов:
Если вы можете быть уверены, что файлы UNICODE имеют метку порядка байтов (BOM), вы можете посмотреть на это. Однако для файлов UNICODE не требуется , чтобы иметь спецификацию, поэтому это зависит от того, откуда они берутся.
Если файл имеет значение UNICODE, вы не можете прочитать его с помощью функции fgets (), вам нужно использовать fgetws () или fread (). Символы UNICODE могут иметь ноль байтов (байтов со значением ноль), что приведет к путанице в fgets ().
Нулевые байты могут быть вашими друзьями. Если вы прочитали комок файла с помощью fread () и обнаружили встроенные нулевые байты, скорее всего, у вас есть UNICODE. Однако обратное неверно - отсутствие нулевых байтов не доказывает, что у вас есть ASCII. Английские буквы в UNICODE будут иметь нулевые байты, но многие другие языки (например, китайский) не будут.
Если вы знаете, на каком языке написан текст, вы можете проверить наличие символов, которые недопустимы на этом языке, но это не так.
Выше я использую UNICODE для Windows - для обозначения UTF16 с порядком байтов Intel. Однако в реальном мире вы можете получить UTF8 или UTF32, и вы можете получить порядок байтов не от Intel. (Теоретически вы можете получить UTF7, но это довольно редко).
Если у вас есть контроль над входными файлами, вы можете настаивать на том, что у них есть спецификации, что облегчает задачу.
В противном случае, если вы знаете язык файлов, вы можете попытаться угадать кодировку, но это менее чем на 100% надежно. В противном случае вам может потребоваться указать оператору (если он есть) указать кодировку.