(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_detect_encoding — Определяет кодировку символов
$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" допустима для:
Пример #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"