Примечание. Как правило, идентификация исходной кодировки текстового файла не является детерминированной проблемой.Если метаданных нет (например, заголовок типа содержимого HTML), вы можете только догадываться.Существуют инструменты и библиотеки, которые помогут вам угадать - и некоторые из них делают довольно хорошую работу - но вы не можете быть на 100% уверены.Это особенно верно, если задействованы 8-битные кодировки (например, Latin-1, Windows CP1252 и т. Д.).
Но если вы уже знаете, что кодировка должна быть либо UTF-8, либо UTF-16, тогда выВы находитесь в хорошей ситуации.
Текстовые файлы в кодировке UTF-16 всегда должны начинаться с BOM .Вы можете использовать этот факт, чтобы обнаружить его присутствие.Существует два разных «вкуса» UTF-16 - Big Endian (BE) и Low Endian (LE).Поскольку UTF-16 использует двухбайтовые слова (16 бит), их можно составить двумя способами: сначала старшим байтом (BE) или первым младшим байтом (LE).Вы можете сказать из спецификации, т.е.глядя на самые первые два байта файла:
FE FF
→ UTF-16 BE FF FE
→ UTF-16 LE
Для UTF-8 спецификация строго не нужна - на самом деле ее использование на самом деле нестандартно.Однако тот факт, что многие приложения Windows постоянно отказываются распознавать кодировку UTF-8, если только они не содержат спецификацию, привел к появлению псевдостандарта «UTF-8 с спецификацией».Если спецификация присутствует, она занимает первые три байта файла:
EF BB BF
→ UTF-8 с спецификацией
ЕслиВаш файл начинается с чего-то другого, затем у вас либо кодировка UTF-8 без BOM, либо кодировка не-UTF (ASCII, Latin-1 ...).