koros
Существующие алгоритмы распознания всегда привязаны к конкретному языку. Это или подсчет кол-ва популярных в языке букв, имеющих разные коды в разных кодировках, или проверка недопустимых в языке сочетаний букв по словарю, или что-то еще, но это всегда привязка к конкретному языку. Алгоритмы эти не определяют однозначно кодировку, а скорее угадывают ее с той или иной степенью вероятности.
По-иному сделать невозможно, просто исходя из природы однобайтных кодировок. Текст - просто набор байт (одна буква - один байт), и нигде нет никакого указания какой кодовой таблицей эти байты надо расшифровывать (какую букву надо поставить заместо этого байта).
Существовал бы такой алгоритм в природе - давно бы написали, и проблема была бы решена. Юникод не от нечего делать придумали, как альтернативу однобайтным кодировкам.
Так что код мой выше может работать только с русскими символами. Смените локаль Windows на, скажем, греческую - станет с ними норм работать, а с русскими перестанет. Потому как нет кодировки "ОЕМ" или "ANSI". Есть семейство таких кодировок. Для русского OEM866 и ANSI1251, для греческого ОЕМ737 и ANSI1253; и т.д.
И если функция _Encoding_OEM2ANSI выполняется в русской Windows, она переводит строку именно из OEM866 в ANSI1251. C буквами из других алфавитов это, понятно, не сработает.