Вы можете использовать различные эвристики, например, проверять высокий процент 00
байт в потоке.(Они не будут присутствовать в UTF-8, но распространены в тексте UTF-16, который содержит символы ASCII.)
Это, однако, не может различить UTF-8 и Windows-1252, которыенесовместимые 8-битные кодировки, которые очень распространены в системах Windows на английском языке (США).Вы можете добавить больше проверок, таких как поиск байтовых последовательностей, которые являются недопустимыми в одной кодировке, но не в другой, но это становится очень сложным и обычно не различает разные однобайтовые кодировки.
Microsoft предоставляетбиблиотека с именем MLang , которая может автоматически обнаруживать UTF-8, UTF-16 и многие 8-битные кодовые страницы, используя статистический анализ байтов в потоке.Его точность довольно хороша, если у него достаточно большой образец текста для работы.Я написал о том, как использовать этот метод , и разместил полный исходный код на GitHub .