Вы не можете зависеть от файла, имеющего спецификацию. UTF-8 этого не требует. И не-Unicode кодировки даже не имеют спецификации. Однако существуют и другие способы обнаружения кодировки.
UTF-32
Спецификация: 00 00 FE FF (для BE) или FF FE 00 00 (для LE).
Но UTF-32 легко обнаружить даже без спецификации. Это связано с тем, что диапазон кодовых точек Unicode ограничен U + 10FFFF, и, таким образом, модули UTF-32 всегда имеют шаблон 00 {00-10} xx xx (для BE) или xx xx {00-10} 00 (для LE) , Если длина данных кратна 4 и соответствует одному из этих шаблонов, можно смело предположить, что это UTF-32. Ложные срабатывания практически невозможны из-за редкости 00 байтов в байтово-ориентированных кодировках.
US-ASCII
Нет спецификации, но она вам не нужна. ASCII может быть легко идентифицирован по отсутствию байтов в диапазоне 80-FF.
UTF-8
Спецификация EF BB BF. Но на это нельзя полагаться. Многие файлы UTF-8 не имеют спецификации, особенно если они созданы в системах, отличных от Windows.
Но вы можете смело предположить, что если файл проверяется как UTF-8, он равен UTF-8. Ложные срабатывания редки.
В частности, учитывая, что данные не являются ASCII, частота ложных срабатываний для 2-байтовой последовательности составляет всего 3,9% (1920/49152). Для 7-байтовой последовательности это менее 1%. Для 12-байтовой последовательности это менее 0,1%. Для 24-байтовой последовательности это меньше 1 на миллион.
UTF-16
Спецификация: FE FF (для BE) или FF FE (для LE). Обратите внимание, что спецификация UTF-16LE находится в начале спецификации UTF-32LE, поэтому сначала проверьте UTF-32.
Если у вас есть файл, который состоит в основном из символов ISO-8859-1, то наличие половины байтов файла, равного 00, также будет сильным показателем UTF-16.
В противном случае единственный надежный способ распознать UTF-16 без спецификации - это поиск суррогатных пар (D [8-B] xx D [CF] xx), но символы не-BMP слишком редко используются для создания этот подход практичен.
XML
Если ваш файл начинается с байтов 3C 3F 78 6D 6C (т. Е. Символов ASCII "<? Xml"), тогда ищите объявление <code>encoding=. Если присутствует, используйте эту кодировку. Если отсутствует, предположим, что UTF-8 является кодировкой XML по умолчанию.
Если вам требуется поддержка EBCDIC, также ищите эквивалентную последовательность 4C 6F A7 94 93.
Как правило, если у вас есть формат файла, который содержит объявление кодировки, тогда ищите это объявление, а не пытайтесь угадать кодировку.
Ничего из перечисленного
Существуют сотни других кодировок, которые требуют больше усилий для обнаружения. Я рекомендую попробовать детектор кодировки Mozilla или его порт .NET .
Разумное значение по умолчанию
Если вы исключили кодировки UTF и не имеете декларации кодировки или статистического обнаружения, указывающего на другую кодировку, предположим, ISO-8859-1 или тесно связанный Окна-1252 . (Обратите внимание, что новейший стандарт HTML требует декларации «ISO-8859-1» для интерпретации как Windows-1252.) Является кодовой страницей Windows по умолчанию для английского языка (и других популярных языков, таких как испанский, португальский, Немецкий и французский), это наиболее часто встречающаяся кодировка, отличная от UTF-8.