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

# mb_detect_encoding

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

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

### Описание

function 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() - Устанавливает или получает порядок определения кодировки символов

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open