mb_detect_encoding

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_detect_encodingОпределяет кодировку символов

Описание

mb_detect_encoding(string $string, array|string|null $encodings = null, bool $strict = false): string|false

Определяет наиболее вероятную кодировку символов строки, переданной в параметр string, проверяя список кандидатов по порядку.

Автоматическое определение предполагаемой кодировки символов не полностью надёжно; без дополнительной информации это похоже на расшифровку зашифрованной строки без ключа. Лучше предпочесть указание кодировки символов, хранящейся или передаваемой с данными, например в HTTP-заголовке Content-Type.

Функция будет полезнее, если вызывать её с многобайтовыми кодировками, поскольку не все последовательности байтов образуют допустимую строку. Если входная строка содержит такую последовательность, кодировка будет отклонена, и будет проверена следующая кодировка.

Список параметров

string

Проверяемая строка (string).

encodings

Список кодировок символов для проверки в заданном порядке. Список может быть определён как массив строк или как одна строка, разделённая запятыми.

Если параметр encodings не задан или равен null, будет выбрана кодировка, установленная в директиве с именем detect_order (устанавливают в директиве mbstring.detect_order настроек конфигурации или функцией mb_detect_order()).

strict

Управляет поведением, когда строка в параметре string недопустима ни для одной перечисленной в параметре encodings кодировки. Если параметр strict установлен в значение false, будет возвращена первая совпавшая кодировка; если параметр strict установлен в значение true, будет возвращено значение false.

Значение по умолчанию для параметра strict можно установить в директиве mbstring.strict_detection настроек конфигурации.

Возвращаемые значения

Функция возвращает кодировку символов, которую обнаружила, или false, если строка недопустима ни для одной из перечисленных кодировок.

Список изменений

Версия Описание
8.2.0 Функция mb_detect_encoding() больше не будет возвращать следующие нетекстовые кодировки: «Base64», «QPrint», «UUencode», «HTML entities», «7 bit» и «8 bit».

Примеры

Пример #1 Пример использования функции mb_detect_encoding()

<?php

// Определение кодировки с текущей detect_order
echo mb_detect_encoding($str);

// Значение «auto» раскрывается в соответствии с директивой mbstring.language
echo mb_detect_encoding($str, "auto");

// Установка параметра «encodings» списком, разделённым запятой
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");

// Установка параметра «encodings» массивом
$encodings = [
"ASCII",
"JIS",
"EUC-JP"
];
echo
mb_detect_encoding($str, $encodings);

Пример #2 Действие параметра strict

<?php

// «áéóú» закодирована в ISO-8859-1
$str = "\xE1\xE9\xF3\xFA";

// Строка недействительна для кодировок ASCII или UTF-8, но UTF-8 считается более близким соответствием
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8'], true));

// Если допустимая кодировка найдена, параметр strict не меняет результат
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], false));
var_dump(mb_detect_encoding($str, ['ASCII', 'UTF-8', 'ISO-8859-1'], true));

Результат выполнения приведённого примера:

string(5) "UTF-8"
bool(false)
string(10) "ISO-8859-1"
string(10) "ISO-8859-1"

Иногда одна и та же последовательность байтов может образовывать допустимую строку в нескольких кодировках символов, и невозможно узнать, какая интерпретация предполагалась. Например, среди многих других байтовая последовательность «\xC4\xA2» может быть:

  • «Ä¢» (U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS с последующим U+00A2 CENT SIGN), закодированная в одной из кодировок — ISO-8859-1, ISO-8859-15 или Windows-1252
  • «ФЂ» (U+0424 CYRILLIC CAPITAL LETTER EF с последующим U+0402 CYRILLIC CAPITAL LETTER DJE), закодированная в ISO-8859-5
  • «Ģ» (U+0122 LATIN CAPITAL LETTER G WITH CEDILLA), закодированная в UTF-8

Пример #3 Действие порядка кодировок при совпадении нескольких кандидатов

<?php

$str
= "\xC4\xA2";

// Строка действительна во всех трёх кодировках, поэтому будет возвращена первая из перечисленных кодировок
var_dump(mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'ISO-8859-5']));
var_dump(mb_detect_encoding($str, ['ISO-8859-1', 'ISO-8859-5', 'UTF-8']));
var_dump(mb_detect_encoding($str, ['ISO-8859-5', 'UTF-8', 'ISO-8859-1']));
?>

Результат выполнения приведённого примера:

string(5) "UTF-8"
string(10) "ISO-8859-1"
string(10) "ISO-8859-5"

Смотрите также

  • mb_detect_order() - Устанавливает или получает порядок определения кодировки символов