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

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