только вот cp1251 от koi8-r отличить не сможет (думаю, что это вообще невозможно).
Не соглашусь. Давным давно еще занимался подобной проблемой. Отличие KOI8-R от CP1251 очень легко распознать. Вобщем, в тексте намного больше строчных букв, чем прописных. На основании этого простой алгоритм. Если кодировка не ЮНИКОД(utf-8, unicode-be,unicode-le,...), то.. Считаем количество симовлов в диапазонах
0xE0-0xFF(win-1251) ;
0xA0-0xAF, 0xE0-0xEF (ibm866);
0xC0-0xDF (koi-8).
В каком диапазоне символов больше, ту кодировку и используем. Вероятность ошибки есть только на ОЧЕНЬ маленьких файлах. Но, в общем случае результат отличный. Для больших файлов можно считать только первый килобайт файла, или, например, до 100 найденых символов в одном из диапазонов.