(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
путём проверки списка кандидатов по порядку.
Надёжность автоматического определения предполагаемой кодировки символов не достигает 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', '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"