Получить кодировку файла

Возможный дубликат:
Определить кодировку файла в PHP

Как я могу выяснить с помощью PHP, какая кодировка файла имеет файл?


person powtac    schedule 16.06.2009    source источник


Ответы (5)


Обнаружение кодировки действительно сложно для всех 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);
}
person pilif    schedule 16.06.2009
comment
Могу я спросить, вы создали эту функцию или она была скопирована откуда-то еще? Я хочу использовать это в каком-то производственном коде, и мне нужно знать происхождение. Также не могли бы вы уточнить, что он делает? Спасибо. - person Gary Willoughby; 14.03.2012
comment
это из комментария в руководстве по PHP: php.net/manual/en /function.mb-detect-encoding.php комментарий от 3 августа 2006 г. - person pilif; 12.04.2012

mb_detect_encoding должен выполнять эту работу.

http://us.php.net/manual/en/function.mb-detect-encoding.php

В настройках по умолчанию он будет обнаруживать только ASCII, UTF-8 и несколько вариантов японского JIS. Его можно настроить для обнаружения большего количества кодировок, если вы укажете их вручную. Если файл является и ASCII, и UTF-8, он вернет UTF-8.

person BlackAura    schedule 16.06.2009
comment
Я не думаю, что ваше последнее утверждение верно. Если бы это было так, то ASCII никогда не был бы обнаружен, потому что все строки ASCII также имеют кодировку UTF-8. Я думаю, что функция mb_detect_order() актуальна для определения того, какая кодировка возвращается, когда допустимо несколько кодировок. По умолчанию ASCII стоит перед UTF-8. - person Rob Kennedy; 16.06.2009
comment
Согласно документации PHP, так и должно работать, да. Просто не кажется. Если бы он работал так, как указано в документации, он бы никогда не вернул UTF-8. Когда я использовал его в прошлом, он предпочитал UTF-8, а не ASCII, возвращая ASCII только тогда, когда строка не является допустимой строкой UTF-8. - person BlackAura; 17.06.2009
comment
Мне пришлось использовать опубликованную функцию pilif, так как она не всегда возвращала правильную кодировку. - person Gary Willoughby; 14.03.2012

На самом деле вы не можете, если только файл не будет достаточно любезен, чтобы рассказать вам где-то внутри него.

Например, файлы 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" />

Существуют методы, которые пытаются угадать, просматривая файл и обнаруживая последовательности байтов, которые предполагают определенные кодировки, но на самом деле это только предположения.

person Rik Heywood    schedule 16.06.2009

Вы можете использовать функцию fread() для поиска в первых нескольких байтах файла «магическое число", а затем сопоставьте это магическое число со списком известных магических чисел для типов файлов.

person Spike Williams    schedule 16.06.2009
comment
Только до довольно ограниченного момента. Кодировка для файла UTF-16 обозначается спецификацией (метка порядка байтов), чтобы различать прямой и прямой порядок байтов (UTF-16LE и UTF-16BE). Но для других наборов кодов обязательной идентификации нет — они просто представляют данные в своей кодировке. - person Jonathan Leffler; 16.06.2009

Предложение BlackAura очень хорошее, ИМХО.

Другой вариант — вызвать файл. (1) в рассматриваемом файле, используя system() или тому подобное. Часто он также может указать вам кодировку. Он должен быть доступен в любой разумной среде UNIX.

person rodion    schedule 16.06.2009