Возможный дубликат:
Определить кодировку файла в PHP
Как я могу выяснить с помощью PHP, какая кодировка файла имеет файл?
Возможный дубликат:
Определить кодировку файла в PHP
Как я могу выяснить с помощью PHP, какая кодировка файла имеет файл?
Обнаружение кодировки действительно сложно для всех 8-битных наборов символов, кроме utf-8 (поскольку не каждая 8-битная последовательность байтов является допустимой utf-8) и обычно требует семантических знаний текста, для которого должна быть обнаружена кодировка.
Подумайте об этом: любая конкретная текстовая информация — это просто набор байтов, не связанный с информацией о кодировке. Если вы посмотрите на какой-либо конкретный байт, он может означать что угодно, поэтому, чтобы определить кодировку, вам придется посмотреть на этот байт в контексте других байтов и попробовать некоторые эвристики, основанные на возможных языковая комбинация.
Однако для 8-битных наборов символов вы никогда не можете быть уверены.
Демонстрация неправильной работы эвристики здесь, например:
http://www.hoax-slayer.com/bush-hid-the-facts-notepad.html
Некоторые 16-битные наборы у вас есть шанс обнаружить, потому что они могут включать метку порядка байтов или иметь каждый второй байт равным 0.
Если вы просто хотите обнаружить UTF-8, вы можете либо использовать mb_detect_encoding, как уже объяснялось, либо использовать эту удобную маленькую функцию:
function isUTF8($string){
return preg_match('%(?:
[\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
|\xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
|\xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
|\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
|[\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
|\xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)+%xs', $string);
}
mb_detect_encoding должен выполнять эту работу.
http://us.php.net/manual/en/function.mb-detect-encoding.php
В настройках по умолчанию он будет обнаруживать только ASCII, UTF-8 и несколько вариантов японского JIS. Его можно настроить для обнаружения большего количества кодировок, если вы укажете их вручную. Если файл является и ASCII, и UTF-8, он вернет UTF-8.
На самом деле вы не можете, если только файл не будет достаточно любезен, чтобы рассказать вам где-то внутри него.
Например, файлы HTML должны содержать метатег типа контента в верхней части, чтобы ваш веб-браузер знал, какая кодировка используется.
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
or
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Существуют методы, которые пытаются угадать, просматривая файл и обнаруживая последовательности байтов, которые предполагают определенные кодировки, но на самом деле это только предположения.
Вы можете использовать функцию fread() для поиска в первых нескольких байтах файла «магическое число", а затем сопоставьте это магическое число со списком известных магических чисел для типов файлов.
Предложение BlackAura очень хорошее, ИМХО.
Другой вариант — вызвать файл. (1) в рассматриваемом файле, используя system() или тому подобное. Часто он также может указать вам кодировку. Он должен быть доступен в любой разумной среде UNIX.