У меня была похожая проблема, когда некоторые фрагменты XML были импортированы в систему CRM с использованием неправильной кодировки (не было никакой кодировки, сохраненной вместе с фрагментами XML).
В цикле я создал поток-обертку, используя текущую кодировку из списка. Кодирование было построено с использованием параметров DecoderExceptionFallback и EncoderExceptionFallback (как упомянуто @Doug). Если во время обработки возникло исключение DecoderFallbackException, исходный поток сбрасывается и используется следующая наиболее вероятная кодировка.
Наш список кодировок был чем-то вроде UTF-8, Windows-1252, GB-2312 и US-ASCII. Если вы попали в конец списка, то поток был действительно плохим и был отклонен / проигнорирован / т. Д.
EDIT:
Я набрал быстрый образец и основные тестовые файлы (источник здесь ). В коде нет эвристики для выбора между кодовыми страницами, которые обе соответствуют одному и тому же набору байтов, поэтому файл Windows-1252 может быть определен как GB2312, и наоборот, в зависимости от содержимого файла и порядка предпочтения кодировки.