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 в параметре string путём проверки списка кандидатов по порядку.

Начиная с PHP 8.1 функция возвращает не первую возможную кодировку, а проверяет каждую допустимую кодировку в списке encodings и эвристически определяет наиболее правильную.

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

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

Внимание

Неточность результата

Название функции вводит в заблуждение: функция «угадывает» кодировку, а не «обнаруживает».

Догадки неточны, поэтому функцией невозможно точно определить правильную кодировку символов.

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

string

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

encodings

Список кодировок символов для проверки. Список определяется как массив строк или как строка со списком кодировок через запятую.

При пропуске параметра encodings или установке для параметра значения null выбирается текущий порядок определения кодировки, который установили в директиве 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

$str
= "\x95\xB6\x8E\x9A\x83\x52\x81\x5B\x83\x68";

// Определение кодировки символов с текущим порядком определения
var_dump(mb_detect_encoding($str));

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

// Установка параметра "encodings" списком значений через запятую
var_dump(mb_detect_encoding($str, "JIS, eucjp-win, sjis-win"));

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

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

string(5) "ASCII"
string(5) "ASCII"
string(8) "SJIS-win"
string(5) "ASCII"

Пример #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']));
var_dump(mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'ISO-8859-5'])); // С php8.1 вернётся кодировка ISO-8859-1, а не UTF-8
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-1"
string(10) "ISO-8859-5"

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

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