Mb detect encoding: примеры (PHP)

Определение кодировки строки с помощью mb_detect_encoding
Раздел: Многобайтовые строки
mb_detect_encoding(string $string, array|string|null $encodings = null, bool $strict = false): string|false

Основные сведения о функции

Функция mb_detect_encoding выполняет определение кодировки переданной строки. Она является частью модуля mbstring и используется для обработки многобайтовых строк. Основное применение — предобработка текстовых данных перед их конвертацией или валидацией.

Аргументы функции
  • string (string) — анализируемая строка.
  • encodings (array|string|null) — список поддерживаемых кодировок для проверки. Можно передать как строку с разделителем-запятой, так и массив. По умолчанию используется значение из mbstring.detect_order.
  • strict (bool) — флаг строгого режима. При значении true функция старается избегать ошибочного определения кодировки для невалидных последовательностей байтов.

Простые примеры использования

Базовое определение кодировки
$str = 'Привет мир!';
echo mb_detect_encoding($str);
// Установлен detect_order: UTF-8, CP1251
UTF-8
С указанием списка кодировок
$str = mb_convert_encoding('Пример', 'Windows-1251', 'UTF-8');
echo mb_detect_encoding($str, ['UTF-8', 'Windows-1251', 'KOI8-R']);
Windows-1251
Использование строгого режима
$str = "\xFF\xFE";
echo mb_detect_encoding($str, 'UTF-8, ASCII', false) ?: 'Не определена';
echo '\n';
echo mb_detect_encoding($str, 'UTF-8, ASCII', true) ?: 'Не определена';
UTF-8
Не определена

Альтернативные функции в PHP

iconv_get_encoding

Функция возвращает текущие настройки iconv, но не определяет кодировку конкретной строки. Используется для получения конфигурации.

Функции проверки допустимости

mb_check_encoding проверяет, соответствует ли строка указанной кодировке. Она более надежна для валидации, чем определение.

$str = 'Текст';
var_dump(mb_check_encoding($str, 'UTF-8'));
bool(true)

Частые ошибки и проблемы

Ложные срабатывания

При коротких или специфичных строках функция может ошибочно определять кодировку из-за совпадения байтовых последовательностей.

$str = 'abc';
echo mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1']);
ISO-8859-1
Неверный порядок кодировок

Некорректный порядок в detect_order приводит к неправильным результатам.

$str = 'Текст';
mb_detect_order(['ASCII', 'UTF-8']);
echo mb_detect_encoding($str);
ASCII

Изменения в новых версиях PHP

В PHP 8.0 добавлена поддержка передачи null в параметре encodings. В таком случае используется порядок detect_order из конфигурации. В PHP 8.2 улучшена обработка строгого режима для некорректных последовательностей байтов.

Расширенные примеры

Обработка массива строк
Пример php
$texts = [
    mb_convert_encoding('Первый', 'CP1251', 'UTF-8'),
    'Второй текст в UTF-8',
    'Third in ASCII'
];
$encodings = ['UTF-8', 'Windows-1251', 'ASCII'];
foreach ($texts as $text) {
    echo mb_detect_encoding($text, $encodings) . "\n";
}
Windows-1251
UTF-8
ASCII
Комбинирование с mb_convert_encoding
Пример php
function autoConvert($str, $targetEncoding = 'UTF-8') {
    $detected = mb_detect_encoding($str, ['UTF-8', 'Windows-1251', 'KOI8-R'], true);
    if ($detected && $detected !== $targetEncoding) {
        return mb_convert_encoding($str, $targetEncoding, $detected);
    }
    return $str;
}
echo autoConvert(mb_convert_encoding('Конвертация', 'KOI8-R', 'UTF-8'));
Конвертация
Анализ смешанного содержимого
Пример php
$mixed = 'ASCII часть ' . mb_convert_encoding('и кириллица', 'CP1251', 'UTF-8');
$possible = ['UTF-8', 'Windows-1251', 'ASCII'];
$detected = mb_detect_encoding($mixed, $possible, false);
if ($detected === 'ASCII') {
    echo 'Обнаружена только ASCII, возможна потеря данных';
}
Обнаружена только ASCII, возможна потеря данных

Аналоги в других языках

Python: chardet

Библиотека chardet предлагает вероятностное определение кодировки, что часто точнее для коротких текстов.

import chardet
result = chardet.detect(b'Hello world')
print(result['encoding'])
ascii
JavaScript: jschardet

Порт библиотеки chardet на JavaScript. Работает в Node.js и требует установки пакета.

const jschardet = require('jschardet');
const detection = jschardet.detect('Пример');
console.log(detection.encoding);
utf-8
MySQL: CHARACTER_SET_NAME

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

SELECT CHARACTER_SET_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'db' AND TABLE_NAME = 'table';

PHP mb_detect_encoding function comments

En
Mb detect encoding Detect character encoding