Если файл состоит из байтов 0x09 (вкладка), 0x0A (перевод строки), 0x0C (перевод формы), 0x0D (возврат каретки) или от 0x20 до 0x7E, то это, вероятно, текст ASCII.
Если файл содержит любой другой управляющий символ ASCII, от 0x00 до 0x1F, за исключением трех вышеупомянутых, то это, вероятно, двоичные данные.
Текст UTF-8 следует очень специфическому шаблону для любых байтов с битами старшего разряда, но кодировки фиксированной длины, такие как ISO-8859-1, не делают. UTF-16 часто может содержать нулевой байт (0x00), но только в любой другой позиции.
Вам понадобится более слабая эвристика для всего остального.